Image Description

什么是高阶函数?

高阶函数是函数式编程中的概念,将函数当成一个变量使用,一个函数可以接收另一个函数作为参数,这种函数就是高阶函数。

代码示例

def add(x, y, f):
    return f(x) + f(y)

当我们调用add(-5, 6, abs)时,参数x,y和f分别接收-5,6和abs,根据函数定义,我们可以推导计算过程为

x = -5
y = 6
f = abs
f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
return 11

add(-5, 6, abs)
11

编写高阶函数,就是让函数的参数能够接收别的函数。

1.Map()

map()函数接受两个参数,一个是函数(序列中的元素需要执行的操作),一个是iterable(一个或多个序列)。map将传入的函数依次作用到序列的每个元素,并把结果作为新的iterator返回。

代码示例

有一个函数f(x)=x2,并把这个函数作用在一个list[1, 2, 3, 4, 5, 6, 7, 8, 9]上,可以用map()实现如下

def f(x):
return x * x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

map()传入的第一个参数是f,即函数对象本身。结果r是一个惰性序列 Iterator,通过list()函数让它把整个序列计算出来并返回一个list。

2.Reduce()
reduce() 把一个函数作用一个序列上[x1, x2, x3, x4, x5],这个函数接收了两个参数,reduce()把结果继续和序列的下一个元素做累计运算。

代码示例

对一个序列求和,用reduce实现:

from functools import reduce
def add(x, y):
return x + y

reduce(add, [1, 3, 5, 7, 9])
25

3.Filter()
Python内置的filter()函数用于过滤序列,它接收一个函数和一个序列,把传入的函数作用于每个元素,根据返回值是true还是false来决定是保留还是丢弃该元素。

代码示例

只保留奇数的fliter()函数

def is_odd(n):
    return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 结果: [1, 5, 9, 15]

4.Sorted()
排序算法的核心是比较两个元素的大小,Python内置的sorted()函数可以对list进行排序

sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

sorted()还可以接受一个函数来实现自定义序列,例如按绝对值大小排序

sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]