您的位置:首页 > 编程语言 > Python开发

Python学习笔记:函数式编程工具

2016-12-06 20:33 477 查看
本篇参考官方文档: 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
函数可以把一些简单的递归用非常简洁的代码解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息