Map, filter,reduce 都是针对可迭代类型(iterable)的循环操作,返回想要的结果。三者使用上有相似性,功能不太相同。
三个函数都需要两个参数,第一个参数是函数名,是指要针对每个元素做的操作,第二个参数为可迭代的序列。
先来看一个例子,假设一个list mylist=[1,2,3,4,5],我们要把每个元素分别乘2输出,正常方法如下:
mylist=[1,2,3,4,5]
result=[]
i=0
while i < len(mylist):
result.append(mylist[i]*2)
i+=1
print(result)
我们使用循环完成了上述功能,但是为了使代码简洁,我们可以通过使用map,而不是用循环。我们只需使用3行代码就可以完成上述功能。
mylist=[1,2,3,4,5]
out=list(map(lambda x:x*2, mylist))
print(out)
所以,map完成的是将mylist中每个元素分别带入lambda函数中进行计算,最终仍然返回list类型的结果,即[2, 4, 6, 8, 10]。
类似,filter也是依次将每个元素带入进行计算,只不过filter返回的是运行结果为真的元素。假设我们想要打印出list中小于4的元素,可以使用如下代码。最终只打印出了1,2,3
mylist=[1,2,3,4,5]
out=list(filter(lambda x: x<4, mylist))
print(out)
[1, 2, 3]
Reduce也是类似,只不过reduce返回的不是元素,而是累计计算各个元素的运行结果。
假设我们要计算list中各个元素的和,可以使用以下代码:最终打印15
mylist=[1,2,3,4,5]
out=reduce(lambda x,y : x+y, mylist)
print(out)