- 5 First-Class Functions
- 6 Design Patterns wiith First-Class Functions
- 7 Function Decorators and Closures
First-Class Functions
创建者Rossum说,不把Python当成函数式编程语言。
Python中,所有函数都是一等公民。即一等对象。
编程语言理论家认为一等对象是:
- 在运行时创建
- 可以分配给变量/数据结构中的元素
- 作为参数传递给一个函数
- 能够以函数形式返回。
在Python, Integers, stirngs, dict,也是一等对象。
Treating a Function Like an Object
看这个例子:
def factorial(n): '''returns n!''' return 1 if n < 2 else n * factorial(n - 1) print(factorial(4)) #24 print(factorial.__doc__) # returns n! print(type(factorial)) # <class 'function'>
上个例子用到了递归。
使用__doc__查看用···xxx···,定义的文档。在控制台,可以使用help(factorial)查看文档。
可以使用:http://www.pythontutor.com/ 工具非常方便。
Higher_Order Functions 高阶函数
一个函数可以接受另一个函数作为参数,或者返回一个函数,就叫做高级函数。
比如map(fun, iterable), sorted(iterable, key=None), filter() , 这是三个内建函数。
>>> def reverse(word): ... return word[::-1] ... >>> reverse('testing') 'gnitset' >>> fruits = ['strawberry', 'fig', 'apple', 'cherry', 'raspberry', 'banana'] >>> sorted(fruits, key=reverse) ['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
Modern Replacements for map, filter, reduce
map和filter返回一个生成器(迭代器),所以现在Python3直接用生成器表达式,Python2用 list 推导式。
reduce被sum()进行求和替代。
Anonymous Functions
lambda关键字,可以创建匿名函数。但Python做了限制,只能使用纯表达式,不能用诸如if, try等语句。
lambda就是一个语法糖,可以用def替代。
lambda创建一个函数对象。
The Seven Flavors of Callable Objects
call operator,就是括号,除了用在自定义的函数,还可以通过使用callable(object),来判断这个对象是否可调用
7种可调用对象:
- User-defined functions: 使用def或lambda创建
- 内建函数,用C语言实现的函数。如len
- 内建方法,用C语言实现的方法。如dict.get
- Methods, 定义在一个类种的函数。
- Classes
- 类实例Class instances
- Generator functions。使用yield的函数/方法,返回的是a generator object
例子:
>>> abs, str, 13 (<built-in function abs>, <class 'str'>, 13) >>> [callable(obj) for obj in (abs, str, 13)] [True, True, False]
来源:https://www.cnblogs.com/chentianwei/p/12018624.html