本节摘要:高阶函数的基本介绍,map( )函数、reduce( )函数、filter( )函数、sorted( )函数的介绍
文章目录
高阶函数
Higher-order function,即高阶函数。
- 变量可以指向函数
例如,Python内置的求绝对值的函数abs():
>>> abs(-5) # 调用该函数用此代码,abs(-5)是函数调用
5
>>> abs # 只写abs,abs是函数本身
<built-in function abs>
>>> x = abs(-5) # 要获得函数调用结果,可以把结果赋值给变量,x变量指向函数abs()
>>> x
5
>>> x = abs # 把函数本身赋值给变量
>>> x
<built-in function abs>
结论:函数本身也可以赋值给变量,即:变量可以指向函数。
如果一个变量指向了一个函数,则可通过调用该变量来调用这个函数:
>>> f = abs # 变量f现在已经指向了abs函数本身
>>> f(-8) # 直接调用abs()函数和调用变量f()完全相同
8
- 函数名也是变量
函数名也是变量,函数名其实就是指向函数的变量,对于abs()
这个函数,完全可以把函数名abs
看成变量,它指向一个可以计算绝对值的函数
如果把abs
指向其他对象
>>> abs = 10
>>> abs
10
>>> abs(-10)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
把abs
指向10
后,就无法通过abs(-10)
调用该函数了!因为abs
这个变量已经不指向求绝对值函数而是指向一个整数10
要恢复abs
函数,请exit()
退出后重启Python交互环境。
注:由于
abs
函数实际上是定义在import builtins
模块中的,所以要让修改abs
变量的指向在其它模块也生效,要用import builtins; builtins.abs = 10
。
- 传入函数
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,函数就可以传入函数和返回函数,这种函数就叫高阶函数。
简单高阶函数例如:
def add(x, y, f):
return f(x) + f(y)
当调用add(2, -5, abs)时,参数x,y和f分别接收2,-5和abs,根据函数定义,可以推导计算过程为:
x = 2
y = -5
f = abs
f(x) + f(y) ==> abs(2) + abs(-5) ==> 7
return 7
代码验证:
>>> def add(x, y, f):
... return f(x) + f(y)
...
>>> print add(2, -5, abs)
7
编写高阶函数,就是让函数的参数能够接收别的函数。
- 总结
把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
map( )函数
map( ) 是一种高阶函数,它接收两个参数,第一个是函数,第二个是Iterable,即可迭代对象。map( )将函数依次作用于Iterable的每个元素,并将结果以Iterator,即迭代器的形式返回。这种方式类似构造出了数学中的映射过程。
例如,函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2,把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上
>>> def f(x):
... return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]