上篇文章中说到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