一、迭代器
1.函数作为变量
python中声明函数就是声明一个类型是function的变量,函数名就是变量名
普通变量能做的事情函数都可以做
1.声明函数就是声明变量,函数名就是变量名
def func1():
print('函数1')
return 100
print(type(func1)) # <class 'function'>
二、系统的实参高阶函数
列表.sort()、sorted()、max()、min()都是实参高阶函数,因为这四个函数中都有一个参数key,要求是一个函数
nums = [10, 20, 49, 2]
nums.sort(reverse=True)
1)排序算法:参数key要求是一个函数,作用是用来定制排序的规则(默认按元素大小从小到大或从大到小排)
参数key的要求:
a.key是一个函数
b.函数中有且只有一个参数,这个参数指向的是序列中的每个元素
c.函数需要一个返回值,这个返回值就是排序的时候比较大小的对象
# 练习:将nums中的元素按个位数从小到大排序
nums = [100, 39, 51, 62, 58]
nums.sort(key=lambda item: item % 10)
print(nums)[100, 51, 62, 58, 39]
# 练习:将学生按成绩从大到小排序
students = [
{'name': '张三', 'age': 18, 'score': 90},
{'name': '李四', 'age': 26, 'score': 80},
{'name': '王五', 'age': 19, 'score': 88},
{'name': '小明', 'age': 15, 'score': 72}
]
students.sort(key=lambda item: item['score'], reverse=True)
print(students)
二、返回值高阶函数
# 1.变量可以作为函数的返回值
def wx_sum(x, y):
t = x + y
return t
print(wx_sum(10, 20)) # 30
# 函数作为函数的返回值 - 返回值高阶函数
# func1就是一个返回值高阶函数
def func1():
def func2():
print('函数2')
return func2
# 2.闭包 - 函数1中声明了一个函数2,并且在函数2中使用了函数1的数据,那么这个函数就是闭包
# 闭包的特点:闭包函数中的数据不会因为函数调用结束而销毁
def func3():
a = 10
def func4():
print(a)
return func4
func3()
# 面试题:
list1 = []
for i in range(5):
list1.append(lambda x: x * i)
print(list1[1](2), list1[2](2), list1[3](2)) # 8 8 8
# 面试题2:函数参数默认值
def func2(seq=[]):
seq.append(10)
return seq
print(func2()) # [10]
print(func2()) # [10, 10]
# 练习:判断输出内容
list1 = [10, 20, 30]
def func3(seq=list1):
seq.append(10)
return seq
func3()
# list1 = [100,200]
list1.append(100)
print(func3()) # [10, 20, 30, 10, 100, 10]
三、装饰器
1.什么是装饰器
装饰器本质是一个函数 = 返回值高阶函数+实参高阶函数+糖语法
装饰器是python的三大神器“装饰器,迭代器,生成器
作用:给已经写好的函数添加新的功能
给函数添加一个功能:统计函数的执行时间
方法1:在每个需要添加功能的函数中加入相应的代码
def wx_sum(x, y):
start = time.time() # 获取当前时间,
sum1 = x + y
print(sum1)
end = time.time() # 结束时间
print('函数执行时间:%fs' % (end - start))
wx_sum(100, 200)
方法2:
注意:这个add_time只能给没有参数的函数添加统计执行时间的功能
def add_time(fn):
start = time.time()
fn()
end = time.time()
print('函数执行时间:%fs' % (end - start))
def add_time2(fn, *args, **kwargs):
start = time.time()
fn(*args, **kwargs)
end = time.time()
print('函数执行时间:%fs' % (end - start))
def func1():
print('========')
def func2():
print('你好世界!')
def func3(x, y):
print('%d + %d = %d' % (x, y, x + y))
add_time(func1)
add_time(func2)
add_time2(func3, 10, 20)
2.装饰器
没有参数的装饰器的函数
def 函数名1(参数1);
def 函数名2(*
arges,**
kwargs
result = 参数1(*
arges,**
kwargs)
新功能对应的代码段
return 函数名2
说明:
函数名1 装饰器的名字:一般根据需要添加的功能命名
参数1 - 需要添加功能的函数,一般命名为fn
函数名2 - 随便命名,一般可以用test
def add_time3(fn):
def test(*args, **kwargs):
start = time.time()
fn(*args, **kwargs)
end = time.time()
print('函数执行时间:%fs' % (end - start))
return test
@add_time3
def func5():
print('d1')
func5()
# 练习:给所有返回值是郑淑德函数添加功能:返回值以十六进制形式的数据返回
def add_hex(fn):
def test(*argd, **kwargs):
re = fn(*argd, **kwargs)
# 判断re是否是整型
# type(re) == int
if isinstance(re, int):
return hex(re)
return re
return test
@add_hex
def wx_sum(x, y):
return x + y
print(wx_sum(10, 20))
四、解包操作
1.解包:在容器型数据类型前加*
或者**
可以对容器进行解包
注意:**
只能放在字典的前面
# 1) *将列表和元组解包
list1 = [10, 20, 30]
print(*list1) # list == [10, 20, 30] -> *list1 == 10,20,30
def func(x, y, z):
print('x:{},y:{},z:{}'.format(x, y, z))
func(*list1)
# 练习:写一个函数,可以对多个数据进行不同的运算
"""
def operation('-',90,28,78)
def operation('+',28,90,78)
"""
def wx_sum(*nums):
sum1 = 0
for i in nums:
sum1 += i
return sum1
def wx_sub(*nums):
sum1 = nums[0]
for i in nums[1:]:
sum1 -= i
return sum1
def operation(char, *num1):
if char == '+':
return wx_sum(*num1)
elif char == '-':
return wx_sub(*num1)
list1 = ['-', 90, 28, 78]
list2 = ['+', 28, 90, 78]
print(operation(*list1))
print(operation(*list2))
# 2)**是将字典解包
dict1 = {'x': 100, 'y': 200}
print(dict1) # dict1 == {'x':100,'y':200} **dict1 == x=100,y=200
# print(**dict1) # print(x=100,y=200)
五、迭代器
1.什么是迭代器(iter)
迭代器也是python提供的容器型数据类型
迭代器存储数据的特点:
一个迭代器可以存储多个数据,如果要获取元素必须将元素从迭代器中取出,
而且去一个就少一个;取出来的数据不能再添加到迭代器中
2.将数据存入迭代器中:
1)将别的序列转换成迭代器
2)创建生成器
list1 = [10, 20, 30]
iter1 = iter(list1)
3.获取迭代器中的元素
迭代器中的元素不管通过什么方式取(无论看或用)出来,那么这个元素在迭代器中就不存在了
1)获取单个元素
next(迭代器) - 取出迭代器中最前面的元素
2)遍历
print(next(iter1)) # 10
print(next(iter1)) # 20
print(next(iter1)) # 30
# print(next(iter1)) # StopIteration
# 2) 遍历 - 一个一个的取所有元素
list1 = [10, 20, 30]
iter1 = iter(list1)
for i in iter1:
print("i:", i, end=' ') # i: 10 i: 20 i: 30