第五章 - 一等函数

一等函数

  把函数视作对象, 在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']

 

posted @ 2017-07-21 17:32  Vincen_shen  阅读(132)  评论(0)    收藏  举报