一等函数
一等对象
在python中,函数是一等对象。编程语言学家把“一等对象”定义为满足下述条件的程序实体:
(1)在运行时创建。
(2)能赋值给变量或数据结构中的元素。
(3)能作为参数传给函数。
(4)能作为函数的返回结果
下例展示了函数对象里的“一等”本性。我们可以把factorial函数赋值给fact,然后通过变量名调用。我们还可以把它作为参数传给map函数。map函数返回一个可迭代对象,里面的元素是把第一个参数应用到第二个参数中各个元素上得到的结果。
高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数
map、filter和reduce的替代品
函数式语言通常会提供map、filter和reduce三个高阶函数,但是由于引入列表推导和生成器表达式,它们没那个重要了,列表推导或生成器表达式具有map和filter两个函数的功能,并且易于阅读。
例:计算阶乘列表:map和filter与列表推导比较
例:使用reduce和sum计算0~99之和
sum和reduce的通用思想是把某个操作连续应用到序列的元素上,累计之前的解雇,把一系列值规约成一个值。all和any也是内置的规约函数。
all:如果iterable的每个元素都是真值,返回True
any:只要iterable中有元素是真值,就返回True
匿名函数
python简单的句法限制了lambda函数的定义体只能使用纯表达式。换句话说,lambda函数定义体中不能赋值,也不能使用while和try等python语句。
例:使用lambda表达式反转拼写,然后依次给单词列表排序。
可调用对象
除了用户定义的函数,调用运算符(即())还可以应用到其他对象上。如果想判断对象是否可以调用,可以使用内置的callable()函数。python数据模型文档列出了7种可以调用的对象:
用户定义的函数:使用def或lambda表达式创建。
内置函数:使用c语言实现的函数,如len或time.strftime
内置方法:使用c语言实现的方法,如dict.get
方法:在类的定义体中定义的函数。
类:调用时会用__new__方法创建一个实例,然后运行__init__方法,初始化实例,最后把实例返回给调用方。
类的实例:如果类定义了__call__方法,那么它的实例可以作为函数调用。
生成器函数:使用yield关键字的函数或方法。调用生成器函数返回的是生成器对象。
用户定义的可调用类型
不仅是python函数是真正的对象,任何python对象都可以表现得像函数,为此,只需实现实例方法__call__。
下例实现了BingoCage类。这个类的实例使用任何可迭代对象构建,而且会在内部存储一个随机顺序排列的列表。调用实例会取出一个元素。