示例 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]
有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数——这是下一节的话题。