Jamal的博客

Python-一等函数

在Python中,函数是一等对象。

一等对象的定义如下:

  • 在运行时创建
  • 能赋值给变量或数据结构中的元素
  • 能作为参数传递给函数
  • 能作为函数的返回结果
1
2
3
4
5
6
7
8
9
10
>>> def factorial(n):
... '''return n!'''
... return 1 if n < 2 else n * factorial(n-1)
...
>>> factorial(10)
3628800
>>> factorial.__doc__
'return n!'
>>> type(factorial)
<class 'function'>

从这个测试中我们可以看出,Python的function是一个对象,其中doc是函数对象众多属性中的一个,我们可以把函数作为参数传递给变量,然后通过变量名调用,也可以作为参数传递给其他函数,例如传递给map函数,map返回一个可迭代对象,如下所示:

1
2
3
4
5
6
7
8
9
>>> fact = factorial
>>> fact(5)
120
>>> fact
<function factorial at 0x101096f28>
>>> map(factorial, range(5))
<map object at 0x1014d46a0>
>>> list(map(factorial, range(5)))
[1, 1, 2, 6, 24]

有了一等函数之后,我们就可以使用函数式编程风格

高阶函数

函数式编程的一大特点之一就是使用高阶函数,高阶函数的定义如下:
接受函数作为参数,或者把函数作为返回值的函数都是高阶函数(high-order function)
sorted就是一个高阶函数,它可以使用可选参数用于提供一个函数来进行排序,如下所示,把len函数传递给key参数,就可以进行排序操作:

1
2
3
>>> fruits = ['aaa', 'banana', 'apple']
>>> sorted(fruits, key=len)
['aaa', 'apple', 'banana']

在函数式编程中,最为人熟知的就是map filter reduce函数了,不过在现有的情况下,可以用列表推导和生成器表达式来替代,其中在Python3中,map和filter返回生成器,因此最接近他们的替代品是生成器表达式,在Python2中返回列表,因此最接近的替代品是列表推导