什么是高阶函数?
对于c/c++来说,我们的函数参数不能是函数,所以他们的参数不能称为高阶函数。所以,在python中(当然,一些其他的高级语言也是支持的),参数能够是函数的函数,我们称这种函数为高阶函数。
示例code:
def high_order_function(x, y, abs):
return abs(x) + abs(y)
# 我们可以看到,这个函数的最后一个参数为内建的abs函数。
# 所以我们可以称 high_order_function() 为高阶函数
今天主要分析,python中的map,reduce,filter,sorted,这四个标准的高阶函数。
map:
map函数,传入两个参数,一个函数,一个序列(或者说是迭代)。作用是把函数作用于序列上的每一个元素。
L = [-1, 2, 3, -7, 10, -9]
def abs_list(L):
return map(abs, L)
print (list(abs_list(L)))
# 输出: [1, 2, 3, 7, 10, 9]
# list() 函数把整个序列都计算出来,返回一个list。
reduce:
reduce函数,必须传入两个参数,一个函数,一个序列。作用是把函数作用于前两个元素的结果和第三个元素再次调用函数。
# 求积
from functools import reduce
L = [1, 2, 3, 4, -1]
def prodect(L):
return reduce(lambda x, y: x * y, L)
print (prodect(L))
# 输出: -24
# 由于我们的 reduce 函数在 functools 模块中,所以我们需要import
filter:
filter函数,必须传入连个参数,一个返回布尔类型的函数,一个序列。作用是用来筛选 函数返回true 的元素,即去掉返回false的元素。
# 筛选偶数
L = [1, 2, 3, 4, 5, 0, 9]
def is_even(x):
return x % 2 == 0
print (list(filter(is_even, L))
# 输出为[2, 4, 0]
sorted:
sorted函数,是一个普通的排序函数。当然,他的不普通在与其中的一个选项参数 key 可以指向一个函数,从而成为高阶函数。 还有一个 reverse 参数,用来指定排序是顺序还是逆序。
# 绝对值排序
L = [1, -3, 0, 2, -9]
L = sorted(L, key = abs)
print (L)
# 输出: [0, 1, 2, -3, -9]
一开始我是这么认为的:
key很c/c++中sort函数中的cmp函数,很是类似。但是,这种认为是错误的。——- 现在看来,我更加喜欢这样的理解:我们把原序列加上一个关键字,按加上的关键字来进行排序。
总结:
简单来说,我们的高阶函数用起来更加方便。更加的抽象。