Python 一等函数( 把函数视作对象)
把函数视作对象
示例 5-1 中的控制台会话表明,Python 函数是对象。这里我们创建了一
个函数,然后调用它,读取它的 doc 属性,并且确定函数对象本
身是 function 类的实例。
示例 5-1 创建并测试一个函数,然后读取它的 doc 属性,再
检查它的类型
>>> def factorial(n): ➊
... '''returns n!'''
... return 1 if n < 2 else n * factorial(n-1)
...
>>> factorial(42)
1405006117752879898543142606244511569936384000000000
>>> factorial.__doc__ ➋
'returns n!'
>>> type(factorial) ➌
<class 'function'>
➊ 这是一个控制台会话,因此我们是在“运行时”创建一个函数。
➋ doc 是函数对象众多属性中的一个。
➌ factorial 是 function 类的实例。
doc 属性用于生成对象的帮助文本。在 Python 交互式控制台
中,help(factorial) 命令输出的内容如图 5-1 所示。
图 5-1:factorial 函数的帮助界面;输出的文本来自函数对象的
doc 属性
示例 5-2 展示了函数对象的“一等”本性。我们可以把 factorial 函数赋
值给变量 fact,然后通过变量名调用。我们还能把它作为参数传给
map 函数。map 函数返回一个可迭代对象,里面的元素是把第一个参数
(一个函数)应用到第二个参数(一个可迭代对象,这里是
range(11))中各个元素上得到的结果。
示例 5-2 通过别的名称使用函数,再把函数作为参数传递
>>> fact = factorial
>>> fact
<function factorial at 0x...>
>>> fact(5)
120
>>> map(factorial, range(11))
<map object at 0x...>
>>> list(map(fact, range(11)))
[1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是
使用高阶函数——这是下一节的话题。