本篇参考官方文档: The PythonTutorial:5.Data Structures
函数式编程可以大大简化代码,本篇学习一下三个对list操作非常有用的函数: filter(),map(),reduce()
filter
filter(function, sequence)
返回一个由序列(sequence)中使得function(item)
为真的元素(item)组成的组成的序列。如果这个序列是str,unicode
或tuple
,结果还是一样的类型。否则,结果都会变成列表。例如,计算一个能被3或5整除的sequence:
>>> 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
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]
map
可接收不止一个序列。那么这个函数的参数个数就必须跟序列个数相同,而且函数作用于几个序列中的相应元素(或者如果一个序列短于另一个,就返回None
)。例如:
>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
reduce
reduce(function, sequence)
返回单个值,这个值是由一个二元函数,先作用于序列的前两个元素,得到的结果再作用于第三个元素,以此类推得到。例如,计算1到10的和:
>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55
如果序列中只有一个元素,就返回它。如果序列是空的,就抛出异常。
reduce
可接收第三个参数来表示开始值(starting value)。在这种情况下如果序列是空的就返回开始值。函数先作用于开始值和序列的第一个元素,以此类推。例如:
>>> def sum(seq): ... def add(x,y): return x+y ... return reduce(add, seq, 0) ... >>> sum(range(1, 11)) 55 >>> sum([]) 0
这三个函数中,只有reduce
比较难懂。在纯函数式编程语言Haskell中也有类似的函数,叫foldr
,顾名思义,就是“向右折叠”,是不是很形象呢?reduce
函数可以把一些简单的递归用非常简洁的代码解决。