第五章 - 一等函数
一等函数
把函数视作对象, 在python中一切皆对象,只要是对象就可以进行传递。
在Python中,函数是一等对象。编程语言理论家把“一等对象”定义为满足下述条件的程序实体:
1、在运行时创建
2、能赋值给变量或者数据结构中的元素 # {'func': <function func at 0x0033B198>}
3、能作为参数传给函数
4、能作为函数的返回结果
在Python中, int, str, dict, list等都是一等对象, 所有函数也都是一等对象。
5.1 把函数视作对象
def func(x): return x * x aa = map(func, range(10)) # 将func函数当作一个对象,传递到map中 print(list(aa)) >>> [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
5.2 高阶函数
接受函数为参数,或者把函数作为结果返回的函数是高阶函数, map函数就是一个示例, 装饰器也是。
map, filter, reduce的现代替代品
函数式语言通常会提供map, filter, reduce三个高阶函数,在Python3中map, filter还是内置函数。但是由于引入了列表推导和生成器表达式,它们就变得没那么重要了。
因为map, filter都可以被 列表推导或生成器表达式 + 三元运算 替代。
归约函数:
sum(*args, **kwargs)
reduce(function, sequence, initial=None)
all(iterable)
any(iterable)
5.3 匿名函数
lambda关键字在Python表达式内创建匿名函数。
5.6 函数内省
__defaults__ 保存函数的形参默认值, 因此不建议将可变对象作为形参的默认值
def func(x=[1,2,3]): for item in x: print(x.pop()) >>>print(func.__defaults__)
([1, 2, 3],)
print("A开始执行") A = func() print("B开始执行") B = func() print(func.__defaults__)
>>>
A开始执行
3
2
B开始执行
1
([],)
5.10 支持函数式编程的包
operator模块为多个算术运算符提供了对应的函数。
operator所有接口:
__all__ = ['abs', 'add', 'and_', 'attrgetter', 'concat', 'contains', 'countOf', 'delitem', 'eq', 'floordiv', 'ge', 'getitem', 'gt', 'iadd', 'iand', 'iconcat', 'ifloordiv', 'ilshift', 'imatmul', 'imod', 'imul', 'index', 'indexOf', 'inv', 'invert', 'ior', 'ipow', 'irshift', 'is_', 'is_not', 'isub', 'itemgetter', 'itruediv', 'ixor', 'le', 'length_hint', 'lshift', 'lt', 'matmul', 'methodcaller', 'mod', 'mul', 'ne', 'neg', 'not_', 'or_', 'pos', 'pow', 'rshift', 'setitem', 'sub', 'truediv', 'truth', 'xor']
* __all__ 用于暴露接口, 只有在__all__中的接口才能被调用
functools模块提供了一系列的高阶函数,最为人熟知的是reduce, wraps。
functools所有接口 __all__ = ['update_wrapper', 'wraps', 'WRAPPER_ASSIGNMENTS', 'WRAPPER_UPDATES', 'total_ordering', 'cmp_to_key', 'lru_cache', 'reduce', 'partial', 'partialmethod', 'singledispatch']