第一章 1.11 高阶函数
一.实参高阶函数
1.函数作为变量使用
python中声明函数就是声明一个类型是function的变量,变量名就是函数名
普通变量能做的函数都能做:
- 1).一个变量可以给另一个变量赋值,函数也可以赋值给一个变量
- 2).变量的值可以修改,函数作为变量并被赋值后,函数原本的功能就消失了
- 3).变量作为序列中的元素,函数也行
- 4).变量作为函数的参数,函数也行
将函数作为另一个函数的参数,这就是实参高阶函数
2.系统的实参高阶函数
列表.sort(); sorted(); max(); min() -> 都有一个参数key,要求是一个函数
例:列表.sort()排序函数,
sort()括号里面有key函数和revers,key函数确定了排序的规则,revers=True时倒序,revers=False时正序
1).排序函数;参数key要求是一个函数,作用是用来定制拍寻的规则
key的要求:
①:key是一个函数
②:函数中有且只有一个参数,这个参数指向的是序列中的每个元素
③:函数需要一个返回值,这个返回值就是排序的时候比较大小的对象
2).最大值函数:
# 练习:进下面的列表按个位数的大小排序
nums = [100, 39, 51, 62, 58]
nums.sort(key=lambda item: item % 10)
print(nums)
print(max(nums, key = lambda item: item % 10))
# 练习:将学生按成绩排序
students = [
{'name': '小明', 'age': 18, 'grade': 90},
{'name': '小花', 'age': 28, 'grade': 59},
{'name': '狗子', 'age': 8, 'grade': 87},
{'name': '大黄', 'age': 45, 'grade': 98}
]
students.sort(revers=True, key=lambda item: item['grade']
print(students)
print(max(students, key = lambda item: item['grade']
# 按学生年龄和分数的和排序
students.sort(key = lambda itme: item['age'] + item['grade']
print(students)
print(max(students,key = lambda item: item['age'] + item['grade']
二.返回值高阶函数
1.函数作为函数的返回值 - 返回值高阶函数
#func1就是一个返回值高阶函数
def func1():
def func2():
print('函数2')
return func2
2.闭包 - 函数1中声明了函数2 ,函数2 中使用了函数1中的数据,则函数1就是一个闭包
特点:闭包函数中的数据不会因为函数调用结束而销毁
def func3():
a = 10
print(id(a))
def func4():
print(a)
print(id(a))
return func4
面试题练习:
#不执行以下代码,问以下代码的执行结果
list1 = []
for i in range(5):
list1.append(lambda x: x*i)
print(list1[1](2), list1[2](2), list1[3](2))
def func2(seq=[]):
seq.append(10)
return seq
print(func2())
print(func2())
三.装饰器
1.什么是装饰器
装饰器本质就是一个函数 装饰器 = 返回值高阶函数+实参高阶函数+糖语法
装饰器是python的三大神器之一:装饰器、迭代器、生成器
装饰器的作用:给已经写好的函数添加新的功能
2.用函数给函数添加功能的方法
方法一
# ①:给不需要参数的函数添加功能
def add_time(fn):
star = time.time()
fn
end = time.time()
print('函数执行时间:%fs' % (end - star))
# ②:给需要参数的函数添加功能
def add_time2(fn, *args, **kwargs):
star = time.time()
fn(*args, **kwargs)
end = time.time()
print('函数执行时间:%fs' % (end - star))
def func1():
print('======')
print('++++++')
def func2():
print('你好,python')
print('你不好,python')
def func3(x, y):
print('%d+%d=%d' % (x, y, x+y))
print(add_time(func1()))
print(add_time(func2()))
print(add_time2(func3, 10, 20))
方法二(装饰器)
无参装饰器函数:
def 函数名1(参数1):
def 函数名2(*args, **kwargs):
参数1(*args, **kwargs)
新功能对应的代码
return 函数名2
说明:
函数名1 - 装饰器的名称;需要添加的共嗯名称
参数1 - 需要添加功能的函数,一般命名为fn
函数名2 - 随便命名,
# 添加统计函数执行时间的装饰器
def add_time3(fn):
def test(*args, **kwargs):
star = time.time()
re =fn(*args, **kwargs)
end = time.time()
print(end - star)
return re
return test
# 练习>>>>>>>
def exchange_hex(fn):
def test(*args, **kwargs):
re = fn(*args, **kwargs)
if type(re) == int:
return hex(re)
return re
return test
@exchange_hex
def diy_sum(x, y):
return x+y
print(diy_sum(10, 20))
四.迭代器
1.什么是迭代器(iter)
迭代器也是python提供的容器型数据类型
迭代器存储数据的特点:
①:一个迭代器能存多个数据
②:若要获取或查看数据必须要从迭代器中取出
③:取出来的数据不能再添加到迭代器
2.将数据存入迭代器
①:将其他序列转换成迭代器
②:创建一个生成器
3.获取迭代器中的元素
迭代器中的元素只要取出(任何方式)那这个元素在迭代器中就不存在了
1).获取单个元素
next(迭代器) - 取出迭代器中最上面的元素
print(next(iter1))
print(next(iter1))
print(next(iter1))
2).遍历
for x in iter2:
print('x:', x)