一、实参高阶函数
如果一个函数的参数是函数, 那么这个函数就是实参高阶函数
怎么确定调用函数的时候参数传什么值
def func2(x):
print(x + 10)
func2(1)
func2(1.34)
func2(True)
def func3(x):
print(x[1])
func3('abc')
func3([10, 20, 30])
func3((1, 2, 3))
def func4(x: list):
x.append(100)
func4([1, 2, 3])
def func5(x):
print(x(100))
def test(a):
return a * 10
func5(test)
func5(lambda item: 'a')
运行结果:
11
11.34
11
b
20
2
1000
a
二、实参高阶函数的应用
除了写装饰器以外, 一般不会自己去定义实参高阶函数, 主要是使用系统已经定义好的实参高阶函数
系统中常用的实参高级函数:max、min、sorted、reduce、map
max、min
max(序列)/min(序列) - 获取指定序列中元素的最大值/最小值
max(序列, key)/min(序列, key) - 参数key的类型是函数
key的要求: a. 是一个函数
b. 有且只有一个参数, 并且这个参数指向的是序列中的每一个元素
c. 需要一个返回值, 这个返回值就是比较大小的时候的比较对象
举例:
nums = [12, 34, 56, 78, 9]
print(max(nums))
print(max(nums, key=lambda item: item))
print(max(nums, key=lambda item: item % 10))
def test(item):
# item = 12
sum1 = 0
for x in str(item):
sum1 += int(x)
return sum1
print(max(nums, key=test)) # 78
运行结果:
78
78
9
78
sorted
sorted(序列) - 讲序列按照序列元素的大小进行排序, 返回排序后的列表
sorted(序列, key) - key: a. 函数
b. 有且只有一个参数(参数就是序列中的元素)
c. 有一个返回值(比较大小的比较对象)
举例:
nums = [73, 69, 57, 28, 71, 54]
print(sorted(nums))
# 按照个位数的大小从小到大排序:
print(sorted(nums, key=lambda item: item % 10))
nums.sort(key=lambda item: item % 10)
print(nums)
students = [
{'name': '小明', 'score': 90, 'age': 23},
{'name': '张三', 'score': 95, 'age': 22},
{'name': '隔壁老王', 'score': 60, 'age': 35}
]
print(sorted(students, key=lambda item: item['score']))
print(sorted(students, reverse = True, key=lambda item: item['score']))
运行结果:
[28, 54, 57, 69, 71, 73]
[71, 73, 54, 57, 28, 69]
[71, 73, 54, 57, 28, 69]
[{'name': '隔壁老王', 'score': 60, 'age': 35}, {'name': '小明', 'score': 90, 'age': 23}, {'name': '张三', 'score': 95, 'age': 22}]
[{'name': '张三', 'score': 95, 'age': 22}, {'name': '小明', 'score': 90, 'age': 23}, {'name': '隔壁老王', 'score': 60, 'age': 35}]
map
用法一:
map(函数, 序列) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求: a.是一个函数 b.有一个参数(指向序列中的每个元素) c.返回值(产生新元素
的规则)
用法二:
map(函数, 序列1, 序列2) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求: a. 是一个函数
b. 有两个参数(第一个参数指向第一个序列中的元素, 第二个参数指向第二个序列中的元素)
c. 一个返回值(产生新元素的规则)
注:两个序列中元素的个数一致
举例:
nums = [23, 35, 67, 91, 25, 45]
new_nums = list(map(lambda item: item % 10, nums))
print(new_nums)
nums = [0.23, 0.35, 0.67, 0.91, 0.25, 0.45]
new_nums1 = list(map(lambda item: item * 100, nums))
print(new_nums1)
new_nums2 = list(map(lambda item: f'{item:.2%}',nums))
print(new_nums2)
strs = ['abc', 'how', 'you', 'love']
nums = [1, 20, 4, 60]
new_list = list(map(lambda x, y: x+str(y), strs, nums))
print(new_list)
prices = [67, 256, 304, 89]
discount = [1, 0.8, 0.75, 0.95]
new_list = list(map(lambda x, y: x*y, prices, discount))
print(new_list)
运行结果:
[3, 5, 7, 1, 5, 5]
[23.0, 35.0, 67.0, 91.0, 25.0, 45.0]
['23.00%', '35.00%', '67.00%', '91.00%', '25.00%', '45.00%']
['abc1', 'how20', 'you4', 'love60']
[67, 204.8, 228.0, 84.55]
reduce
方法一:
reduce(函数, 序列) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求: a.函数 b.有两个参数(第一个参数第一次指向的是序列的第一个元素, 从第二次开始指向的是上次运算的结果)第二个参数指向的是序列第二个开始的每个元素
方法二:
reduce(函数, 序列, 初始值)- 将序列中所有的元素按照函数规定的操作进行合并
函数的要求: a.函数 b.有两个参数(第一个参数第一次指向的是序列的第一个元素, 从第二次开始指向的是上次运算的结果)第二个参数指向的是序列的每个元素
注:需要导入 from functools import reduce
举例:
from functools import reduce
nums = [12, 34, 45, 67, 89, 23]
result = reduce(lambda x, y: x+y, nums)
print(result)
students = [
{'name': '小明', 'score': 90, 'age': 23},
{'name': '张三', 'score': 95, 'age': 22},
{'name': '隔壁老王', 'score': 60, 'age': 35}
]
result = reduce(lambda x, y: x + y['score'], students, 0)
print(result)
运行结果:
270
245