高阶函数满足条件:
1、 函数名被作为参数传给另外一个函数
2、 函数返回值为另外一个函数(返回为自己,则为递归)
一、 高阶函数:map
【 map函数】说明
可以去查看源码, 会发现:map的__init__中有两个参数:func, *iterables
第一个参数func: 即:函数名, 即实现功能的函数,可以是自行定义的,也可以是内置支持的
第二个参数iterables: 即:序列对象,如:str、list、等
【 案例说明】
list1 = [1,2,3,4,5,6,7,8,9]
要实现这样一个功能: 遍历list1每一个元素,并进行元素本身相乘2次生成新的列表,即:
list2 = [1, 4, 9, 16, 25, 36, 49, 64, 81]
【注】: 本次会稍带复习上一节内容: 列表生成式、生成器、迭代器
实现方法1: map
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1、最初级实现:
list2 = []
for one in list1:
list2.append(one * one)
# 2、借助列表生成器实现:
list2 = [one * one for one in list1]
# 3、 借助生成器 --与列表生成器实现复杂度大差不差,且无必要
list2 = (one * one for one in list1)
# 4、 借助迭代器实现
def func2(list1: list):
for one_ele in list1:
yield one_ele * one_ele
list2 = func2(list1)
# 5、借助map函数实现
def funcx(num):
return num * num
list2 = map(funcx, list1)
print(list2)
通过map函数实现结果打印,我们会发现返回的是一个map实例对象
那么如果想要查看到所有元素,怎么处理呢? 这里就用到了 list函数
此案例可能大家会觉着还不如列表表达式实现方便呢? 就不需要map了吧? 当前案例只是说明用法, 一般情况map也不会应用在这么简单的场景中, 比如如果要进行特别多逻辑的特殊处理时,可能列表表达式就不足以支持了
实现方法2: map、lamda
像上述funcx()函数实现比较简单, 这种我们也可以使用内置的lamda来替代
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 6、借助map函数&、lamda函数实现
func = lambda x: x ** 2
list2 = list(map(func, list1))
print(list2)
二、 高阶函数: reduce
【 函数说明】 累计计算
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
【案例说明】求列表元素和
如: list1 = [1,2,3,4,5,6,7,8,9]. sum =45
from functools import reduce
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 1、普通实现算法
sum = 0
for one_ele in list1:
sum += one_ele
# 2、 reduce用法
def add(x, y):
return x + y
sum1 = reduce(add, list1)
print(sum)
三、 高阶函数: filter
函数说明:
1、 实现功能:filter()函数用于过滤实现符合条件的“筛选”内容(True)
2、 与map区别点:filter()把传入的函数依次作用于每个元素,根据返回值(boolean)来确定要保留的数据(return结果为True)
3、filter()函数返回的是一个Iterator,如果涉及计算结果,需要用list()函数获得所有结果并返回list
"""获取0-100内既是2又是3的倍数数据"""
def func(x):
return x % 2 == 0 and x % 3 == 0
all_data = list(filter(func, range(1, 100)))
print(all_data)
四、 高阶函数: sorted
函数功能:用于排序
函数参数说明: sorted(iterable, key=None, reverse=False)
第1个参数: iterable 表示指定的序列
第2个参数: key 参数可以自定义排序规则,可以多项
第3个参数: reverse 参数指定以升序(False,默认)还是降序(True)进行排序
函数使用场景可参考如下案例说明 &代码是可以直接运行的:
1、简单排序-列表排序-无key
【备注】 元组也是同样使用方法,用法一致
list1 = [1, 4, 9, 17, 3, 8, 12, 34, 0, 3, 7, 4]
print(sorted(list1))
2、 较复杂排序, key字段
dict1 = [{"name": "Lujier1", "age": 19, "score": 99, "sex": "Female"},
{"name": "Lujier2", "age": 21, "score": 102, "sex": "Female"},
{"name": "Lujier3", "age": 22, "score": 132, "sex": "male"},
{"name": "Lujier4", "age": 21, "score": 97, "sex": "male"},
{"name": "Lujier5", "age": 32, "score": 103, "sex": "male"}]
# 按照score升序排列
print(sorted(dict1, key=lambda x: x['score']))
# 按照score降序排列
print(sorted(dict1, key=lambda x: -x['score']))
print(sorted(dict1, key=lambda x: x['score'], reverse=True))
# 按照age升序排序, 按照score降序展示(即:如果age相同,则高分在前)
print(sorted(dict1, key=lambda x: (x['age'], -x['score'])))