Python中的函数是”一等公民“。所谓一等公民,含义是:
- 运行时创建;
- 能够赋值给变量;
- 能作为参数传给函数;
- 能作为函数返回结果;
可见,大多数Python
内置的数据结构(数字,字符,字典,列表,元组等等)都是“一等公民”。
高阶函数
所谓高阶函数,就是接受函数作为参数的函数。比如说,sorted
方法就是,一个高阶函数,它的key
参数接受函数。
>>> def reverse(word):
... return word[::-1]
>>> reverse('testing')
'gnitset'
>>> sorted(fruits, key=reverse)
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>> sorted(fruits, key=lambda word: word[::-1])
['banana', 'apple', 'fig', 'raspberry', 'strawberry', 'cherry']
>>> sorted(fruits, key=len)
['fig', 'apple', 'cherry', 'banana', 'raspberry', 'strawberry']
在函数编程范式中,最为人广为熟知的就是map
,reduce
,filter
。
# map, filter可以用推导式语法替代
>>> list(map(fact, range(6)))
[1, 1, 2, 6, 24, 120]
>>> [fact(n) for n in range(6)]
[1, 1, 2, 6, 24, 120]
>>> list(map(factorial, filter(lambda n: n % 2, range(6))))
[1, 6, 120]
>>> [factorial(n) for n in range(6) if n % 2]
[1, 6, 120]
# reduce一般用于求和
>>> from functools import reduce
>>> from operator import add
>>> reduce(add, range(100))
4950
>>> sum(range(100))
4950
自定义可调用类型
基于Python
的“鸭子类型”(duck typing)机制,任何在内部实现了__call__()
方法的对象都可以被调用。
import random
class BingoCage:
def __init__(self, items):
self._items = list(items)
random.shuffle(self._items)
def pick(self):
try:
return self._items.pop()
except IndexError:
raise LookupError('pick from empty BingoCage')
def __call__(self):
return self.pick()
>>> bingo = BingoCage(range(7))
>>> bingo.pick()
3
>>> bingo()
5
>>> callable(bingo)
True