python函数式编程工具。对于链表来讲,有三个内置函数非常有用: filter(),map() 以及 reduce()。
filter(function, sequence)
返回一个 sequence(序列),包括了给定序列中所有调用 function(item)
后返回值为 true 的元素(如果可能的话,会返回相同的类型)。如果该 序列 (sequence)是一个 str, unicode 或者 tuple,返回值必定是同一类型,否则,它总是 list。例如,以下程序可以计算一个被 3 或者 5 整除的序列:
>>> def f(x): return x % 3 == 0 or x % 5 == 0 ... >>> filter(f, range(2, 25)) [3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24]
map(function, sequence)
为每一个元素依次调用 function(item)
并将返回值组成一个链表返回。例如,以下程序计算立方:
>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
可以传入多个序列,函数也必须要有对应数量的参数,执行时会依次用各序列上对应的元素来调用函数(如果某些序列比其它的短,就用 None
来代替)。如果把 None
做为一个函数传入,则直接返回参数做为替代。例如:
>>> seq = range(8) >>> def add(x, y): return x+y ... >>> map(add, seq, seq) [0, 2, 4, 6, 8, 10, 12, 14]
reduce(function, sequence)
返回一个单值,它是这样构造的:首先以序列的前两个元素调用函数 function,再以返回值和第三个参数调用,依次执行下去。例如,以下程序计算 1 到 10 的整数之和:
>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55 如果序列中只有一个元素,就返回它,如果序列是空的,就抛出一个异常。
可以传入第三个参数作为初始值。如果序列是空的,就返回初始值,否则函数会先接收初始值和序列的第一个元素,然后是返回值和下一个元素,依此类推。例如:
>>> def sum(seq):
... def add(x,y): return x+y
... return reduce(add, seq, 0)
...
>>> sum(range(1, 11))
55
>>> sum([])
0
不要像示例中这样定义 sum():因为合计数值是一个通用的需求,早已有内置的 sum(sequence)
函数,非常好用。