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

Python 函数式编程之 filter()、map()和reduce()

2014-08-06 15:23 555 查看
上篇文章中说到lambda 的用法,再来看下其它几个和函数式编程相关的功能函数:filter()、map()、reduce()

1. filter()

格式:filter(函数名, 可迭代对象)

从函数名上理解,这个函数的作用就是“过滤”,函数名部分就是“过滤”的条件(或者说是过滤的规则),迭代对象就是被过滤的原始对象,最后返回过滤后的迭代的对象(元组或列表)。如:

>>> filter(lambda x: x%2 == 0, range(0, 10))
0, 2, 4, 6, 8
>>> filter(lambda x: x.isalpha(), 'a1b2c3d4')
'abcd'


如果函数部分的定义,没有产生逻辑值(相当于没有条件判断),则返回原迭代对象。如:

>>> fiilter(lambda x: x+x, range(1, 10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

2. map()

格式:map(函数名,可迭代对象)

map是将迭代对象中的元素作为参数逐个传入函数,并返回函数执行后的列表。如:

>>> map(lambda x: x**2, range(10))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


如果函数的参数不止一个,那么迭代对象也要相应的增加,如:

>>> map((lambda x, y: x+y), [1, 2, 3], [4, 5, 6])  # 函数传入两个参数
[5, 7, 9]
>>> map((lambda x, y, z: x+y+z), [1, 2, 3], [4, 5, 6], [7, 8, 9])  # 函数传入三个参数
[12, 15, 18]


还有种情况是,如果没有函数,只有一个可迭代对象,则原样返回这个可迭代对象,如:

>>> map(None, [1, 2, 3])  # 没有函数,要用None代替
[1, 2, 3]


要是,没有函数,且有多个迭代对象,则将各个迭代对象中同索引位置的元素作为一个元组,然后返回每个元组作为元素的列表,如:

>>> map(None, [1, 2, 3], [4, 5, 6])
[(1, 4), (2, 5), (3, 6)]

>>> map(None, (1, 2, 3), [4, 6, 8, 8])
[(1, 4), (2, 6), (3, 8), (None, 8)]

>>> map(None, (1, 2, 3, 4, 5), [4, 6, 8, 8], [3, 2, 1, 3, 4, 5, 5, 5])
[(1, 4, 3), (2, 6, 2), (3, 8, 1), (4, 8, 3), (5, None, 4), (None, None, 5), (None, None, 5), (None, None, 5)]


3. reduce()

格式:reduce(函数名, 可迭代对象)

reduce 内的函数必须要是两个参数,不能多,也不能少。它的工作机制是,将迭代对象中的前两个元素作为参数传入函数内,执行后返回一个值。再将这个返回值与迭代对象中的第三个元素作为函数参数传入函数,依此类推,最后返回一个结果。如:

>>> reduce((lambda x, y: x+y), [1, 2, 3, 4, 5])
15


还有种情况是,除了函数名,和一个迭代对象外,还可传入第三个参数作为函数计算结果的“基础值”,如:

>>> reduce((lambda x, y: x+y), [1, 2, 3, 4, 5], 100)  # 100做为基础值不作为参数传入函数,只与函数最后返回的结果相加。
115  # 100 + 15
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  filter map reduce