我们都知道,Python 中的函数是可以有参数的,参数类型可以是字符串、整数或者其他数据类型。
那有没有可能把一个函数作为参数传递给另外一个函数呢?
完全可以,这就是我们今天要学习的高阶函数。
内置高阶函数
Python 总共内置了三个高阶函数,分别是 map
、filter
和 reduce
。
1、map
该函数接收两个参数,一个函数和一个序列,并将函数作用在序列的每个元素上,然后将处理之后的结果返回。
序列可以简单的理解为前面学习过的列表或元组。
比如现在我们需要对用户输入的英文名做校验,即除了第一个字母大写外,其余字母均为小写。正常来说你可以这么做。
def capitalize(name):
return name.capitalize()
names = ['liSA', 'LiLI', 'LILEI']
for name in names:
print(capitalize(name), end=' ')
# 输出结果
Lisa Lili Lilei
但这么写有点复杂了,使用 map
之后就会变的非常简单了。
names = ['liSA', 'LiLI', 'LILEI']
new_names = map(capitalize, names)
print(list(new_names))
# 输出结果
['Lisa', 'Lili', 'Lilei']
我们只需要将函数 capitalize
和名字列表传入 map
函数,map
函数会自动格式化列表中的每一个名字,然后将结果返回给调用者。
2、filter
和 map
类似,该函数同样接受一个函数 f
和一个序列 list
作为参数。其作用就是判断序列中的每个元素是否符合函数 f
中的过滤条件,如果函数 f
返回 True
,则保留,否则就过滤掉。
下面的例子会筛选出列表中的偶数。
普通写法:
def is_even(num):
return num % 2 == 0
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
new_nums = []
for num in nums:
if is_even(num):
new_nums.append(num)
print(new_nums)
# 输出结果
[2, 4, 6, 8]
使用 filter
写法:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
new_nums = filter(is_even, nums)
print(list(new_nums))
# 输出结果
[2, 4, 6, 8]
3、reduce
reduce
接收的参数和上面两个函数类似,都是一个函数 f
和一个序列 list
,但其作用流程有所不同。
函数 f
必须接收两个参数 x
和 y
,reduce
每一次迭代都会将上一次作用于 x
的结果与本次迭代的参数 y
一起传入参数 f
。
看个 🌰
def add(x, y):
return x + y
In [7]: nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [8]: reduce(add, nums)
Out[8]: 55
其计算流程如下:
- 再把计算结果 3 和第三个元素传入
add
,add(3, 3) = 6
- 再次把计算结果 6 和第四个元素传入
add
,add(6, 4) = 10
以此类推,直到最后一个元素,得出结果 55。