目录
把函数视作对象
编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
在运行时创建 ;
能赋值给变量或数据结构中的元素 ;
能作为参数传给函数 ;
能作为函数的返回结果;
高阶函数和匿名函数
有了一等函数,就可以使用函数式风格编程。函数式编程的特点之一是使用高阶函数。
接受函数为参数,或者把函数作为结果返回的函数是高阶函数(higher- order function)。比如内置函数 sorted,函数被作为关键字参数 key(任何单参数函数都能作为 key 参数的值)。
map、filter和reduce
函数式语言通常会提供 map、filter 和 reduce 三个高阶函数。
列表推导或生成器表达式具有 map 和 filter 两个函数的功能,而且更易于阅读。在 Python 3 中,map 和 filter 返回生成器(一种迭代器),因此现在 它们的直接替代品是生成器表达式(在 Python 2 中,这两个函数返回列表,因此最接近的替代品是列表推导)。
可调用对象
内置函数。使用 C 语言(CPython)实现的函数,如 len 或 time.strftime。
内置方法。使用 C 语言实现的方法,如 dict.get。
方法。在类的定义体中定义的函数。
类。调用类时会运行类的 __new__ 方法创建一个实例,然后运行 __init__ 方法,初始化实例,最后把实例返回给调用方。因为 Python 没有 new 运算符,所以调用类相当于调用函数。(通常,调用类会创建那个类的实例,不过覆盖 __new__ 方法的话,也可能出现其他行为。 19.1.3 节会见到一个例子。)
类的实例。如果类定义了 __call__ 方法,那么它的实例可以作为函数调用。
生成器函数 。使用 yield 关键字的函数或方法。调用生成器函数返回的是生成器对象。
object.
__call__
(self[, args...])
此方法会在实例作为一个函数被“调用”时被调用;如果定义了此方法,则 x(arg1, arg2, ...)
就相当于 x.__call__(arg1, arg2, ...)
的快捷方式。
函数的参数
__defaults__ 位置或关键字参数的任何默认值的元组
__annotations__ 将参数名映射到批注;“return”键保留给返回批注。
函数注解
operator 模块
operator.
itemgetter
(*items)
返回一个使用操作数的 __getitem__()
方法从操作数中获取 item 的可调用对象。 如果指定了多个条目,则返回一个查找值的元组。 例如:
-
在
f = itemgetter(2)
之后,调用f(r)
将返回r[2]
。
operator.
attrgetter
(*attrs)
返回一个可从操作数中获取 attr 的可调用对象。 如果请求了一个以上的属性,则返回一个属性元组。 属性名称还可包含点号。 例如:
-
在
f = attrgetter('name')
之后,调用f(b)
将返回b.name
。
operator.
methodcaller
(name, /, *args, **kwargs)
返回一个在操作数上调用 name 方法的可调用对象。 如果给出额外的参数和/或关键字参数,它们也将被传给该方法。 例如:
-
在
f = methodcaller('name')
之后,调用f(b)
将返回b.name()
。
functools.
partial
functools.
partial
(
func,
/,
*args,
**keywords)
partial()
会被“冻结了”一部分函数参数和/或关键字的部分函数应用所使用,从而得到一个具有简化签名的新对象。