示例 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__ 是函数对象众多属性中的一个。

factorialfunction 类的实例。

__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]

有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数——这是下一节的话题。