实参高阶函数
定义: 如果一个函数的参数是函数,那么这个函数就是实参高阶函数
**应用:**除了写装饰器以外,一般不会自己去定义实参高阶函数,主要是使用系统已经定义好的实参高阶函数。系统中常用的实参高阶函数:max、min、sorted、reduce、map
1)max、min
用法:
-
max(序列)\min(序列) - 获取指定序列中元素的最大值\最小值
-
max(序列,key)\min(序列,key) - 参数key的类型是函数
key的要求:
- 是一个函数
- 有且只有一个参数,并且这个参数指向的是序列中的每一个元素
- 需要一个返回值,这个返回值就是比较大小的时候的比较对象
例:
nums = [1012, 34, 756, 78, 29]
print(max(nums))
print(max(nums, key=lambda item: item)) # 78; 比较元素本身的大小
print(max(nums, key=lambda item: item % 10)) # 29
2) sorted
- sorted(序列) - 将序列按照序列元素的大小进行排序,返回排序后的列表
- sorted(序列, key) -
key的要求: - 函数
- 有且只有一个参数(参数就是序列中的元素)
- 有一个返回值(比较大小的比较对象)
例:
nums = [73, 69, 57, 28, 71, 54]
print(sorted(nums)) # [28, 54, 57, 69, 71, 73]
# 按照个位数的大小从小到大排序: [71, 73, 54, 57, 28, 69]
print(sorted(nums, key=lambda item: item%10)) # [71, 73, 54, 57, 28, 69]
3) map
用法一:
map(函数, 序列) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求: a.是一个函数 b.有一个参数(指向序列中的每个元素) c.一个返回值(产生新元素的规则)
用法二:
map(函数, 序列1, 序列2) - 将序列按照函数给定的规则创建成一个新的序列
函数的要求:
a.是一个函数
b.有两个参数(第一个参数指向第一个序列中的元素, 第二个参数指向第二个序列中的元素)
c. 一个返回值(产生新元素的规则)
注意:两个序列中元素的个数一致
例:
方法一:
生成一个新的列表,元素是nums中所有元素的个位数
nums = [23, 35, 67, 91, 25, 45]
new_nums = list(map(lambda item: item % 10, nums))
print(new_nums) # [3, 5, 7, 1, 5, 5]
方法二:
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) # ['abc1', 'how20', 'you4', 'love60']
4)reduce
方法一:
reduce(函数, 序列) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次指向的是序列的第一个元素,从第二次开始指向的是上次运算的结果;第二个参数指向的是序列第二个开始的每个元素)
方法二:
reduce(函数, 序列, 初始值) - 将序列中所有的元素按照函数规定的操作进行合并
函数的要求:
a.函数
b.有两个参数(第一个参数第一次是初始值,从第二次开始指向的是上次运算的结果;
第二个参数指向的是序列的每个元素)
例:
方法一:
nums = [12, 34, 45, 67, 89, 23]
求和
result = reduce(lambda x, y: x+y, nums)
print(result) # 270
#方法二:
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) # 245
推导式
什么是列表推导式 - 用来快速创建列表
方法一:
列表 = [表达式 for 变量 in 序列] - 产生一个新的列表,变量在序列中每取一个元素就将表达式的值添加到新列表中
方法二:
列表 = [表达式 for 变量 in 序列 if 条件语句]
方法三
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2 ]
列表 = [表达式 for 变量1 in 序列1 for 变量2 in 序列2 if 条件语句]
例:
方法一:
list1 = [10 for x in range(5)]
print(list1) # [10, 10, 10, 10, 10]
方法二:
list5 = ['str'+str(x) for x in [10, 34, 15, 11, 78, 90, 99] if x % 2]
print(list5) # ['str15', 'str11', 'str99']
方法三:
list7 = [f'{x}:{y}' for x in range(1, 5) for y in range(10, 14)]
print(list7) # ['1:10', '1:11', '1:12', '1:13', '2:10', '2:11', '2:12', '2:13', '3:10', '3:11', '3:12', '3:13', '4:10', '4:11', '4:12', '4:13']
字典推导式
用法:
字典 = {key:value for 变量 in 序列}
字典 = {key:value for 变量 in 序列 if 条件语句}
例:
方法一:
dict1 = {x: x*2 for x in range(5)}
print(dict1) # {0: 0, 1: 2, 2: 4, 3: 6, 4: 8}
方法二:
dict2 = {'a': 1, 'b': 2, 'c': 3, 'd': [1, 2]}
dict3 = {value: key for key, value in dict2.items() if type(value) not in (dict, list, set)}