map(),filter()和reduce()是Python的内置函数。这些功能启用了Python的功能编程方面。在函数式编程中,传递的参数是决定输出的唯一因素。这些功能可以将任何其他功能用作参数,也可以提供给其他功能作为参数。现在让我们更深入地研究这些功能。
map()函数:
map()函数是一种高阶函数。如前所述,此函数将另一个函数与一个可迭代序列一起作为参数,并在将该函数应用于序列中存在的每个可迭代序列之后返回输出。其语法如下:
句法:
地图(函数,可迭代)
在此,函数定义了一个表达式,该表达式又应用于可迭代对象。map函数可以将用户定义的函数以及lambda函数作为参数。
在以下范围内使用用户定义的函数和Lambda函数:
map()中的用户定义函数:
map()函数可以将用户定义的函数作为参数。这些功能的参数由用户或程序员专门设置。例如:
例子:
def newfunc(a):
return a*a
x = map(newfunc, (1,2,3,4)) #x is the map object
print(x)
print(set(x))
输出:
<位于0x00000284B9AEADD8的地图对象>
{16, 1, 4, 9}
如您所见,x是一个地图对象。下一部分输出显示以newfunc()作为参数的map函数,然后将a * a应用于所有可迭代对象。结果,所有可迭代变量的值将自身相乘并返回。
注意:输出不是按可迭代的值的顺序,因为我使用过set()函数。您还可以使用list()或tuple()函数,例如:
例子:
def newfunc(a):
return a*a
x = map(newfunc, (1,2,3,4)) #x is the map object
print(x)
print(list(x))
输出:
<位于0x00000284B9AEA940的地图对象>
[1, 4, 9, 16]
您还可以传递多个参数列表。例如:
例子:
def func(a, b):
return a + b
a = map(func, [2, 4, 5], [1,2,3])
print(a)
print(tuple(a))
输出:
<位于0x00000284B9BA1E80的地图对象>
(3, 6, 8)
现在让我们看看如何在map()函数中使用lambda函数。
map()中的Lambda函数:
Lambda函数是具有任何名称的函数。这些功能通常作为参数提供给其他功能。现在让我们尝试将lambda函数嵌入map()函数中。考虑以下示例:
例子:
tup= (5, 7, 22, 97, 54, 62, 77, 23, 73, 61)
newtuple = tuple(map(lambda x: x+3 , tup))
print(newtuple)
输出:
(8, 10, 25, 100, 57, 65, 80, 26, 76, 64)
上面的输出是将lambda表达式(x + 3)应用于元组中存在的每个项目的结果。
filter()函数:
filter()函数用于创建由值组成的输出列表,该值针对该值返回true。它的语法如下:
句法:
过滤器(函数,可迭代)
就像map()一样,可以使用此函数,也可以将用户定义的函数以及lambda函数用作参数。
例子:
def func(x):
if x>=3:
return x
y = filter(func, (1,2,3,4))
print(y)
print(list(y))
输出:
<位于0x00000284B9BBCC50的过滤器对象>
[3, 4]
如您所见,y是过滤器对象,并且列表是条件(x> = 3)正确的值的列表。
在filter()中使用lambda:
用作参数的lambda函数实际上定义了要检查的条件。例如:
例子:
y = filter(lambda x: (x>=3), (1,2,3,4))
print(list(y))
输出:
[3,4]
上面的代码产生的输出与以前的函数相同。
reduce()函数:
顾名思义,reduce()函数将给定函数应用于可迭代对象并返回单个值。
该函数的语法如下:
句法:
减少(函数,可迭代)
此处的函数定义了需要将哪些表达式应用于可迭代对象。此功能需要从functools模块导入。例如:
例子:
from functools import reduce
reduce(lambda a,b: a+b,[23,21,45,98])
输出: 187
在上面的示例中,reduce函数连续添加列表中存在的每个可迭代对象,并返回单个输出。
Python中的map(),filter()和reduce()函数可以一起使用。
一起使用map(),filter()和reduce()函数:
执行此操作时,首先会解析内部函数,然后外部函数将对内部函数的输出进行操作。
让我们首先尝试将filter()函数作为参数传递给map()函数。
在map()中使用filter():
下面给出的代码首先检查条件(x> = 3)对于可迭代对象是否为真。然后,使用map()函数映射输出。
例子:
c = map(lambda x:x+x,filter(lambda x: (x>=3), (1,2,3,4)))
print(list(c))
输出: [6,8]
如果从给定的元组中滤除大于或等于3的整数,则结果为[3,4]。然后,如果使用(x + x)条件映射此条件,则将获得[6,8],即输出。
在filter()中使用map():
当您在filter()函数中使用map()函数时,可迭代对象首先由map函数进行操作,然后将filter()的条件应用于它们。
例子:
c = filter(lambda x: (x>=3),map(lambda x:x+x, (1,2,3,4))) #lambda x: (x>=3)
print(list(c))
输出: [ 4、6、8 ]
在reduce()中使用map()和filter():
内部函数的输出根据提供给reduce()函数的条件而减少。
例子:
d = reduce(lambda x,y: x+y,map(lambda x:x+x,filter(lambda x: (x>=3), (1,2,3,4))))
print(d)
输出: 14
输出是[6,8]的结果,它是内部map()和filter()函数的结果。
通俗的说..都是用在一堆数据(比如一个列表)上..
map是用同样方法把所有数据都改成别的..字面意思是映射..
比如把列表的每个数都换成其平方..
reduce是用某种方法依次把所有数据丢进去最后得到一个结果..字面意思是化简..
比如计算一个列表所有数的和的过程,就是维持一个部分和然后依次把每个数加进去..
filter是筛选出其中满足某个条件的那些数据..字面意思是过滤..
比如挑出列表中所有奇数..
>>> map(lambda x:x*x,[0,1,2,3,4,5,6])
[0, 1, 4, 9, 16, 25, 36]
>>> reduce(lambda x,y:x+y,[0,1,2,3,4,5,6])
21
>>> filter(lambda x:x&1,[0,1,2,3,4,5,6])
[1, 3, 5]
嘛..如果题主这么问是因为觉得有点混淆想要区分的话..
简单来讲..都是处理一堆数据..然后看输出数据的数量..
原先有多少map完后还是有多少..
原先不管有多少reduce后都只剩一个结果..
filter完则是原先的一部分,也许全都还在,也许全都没了,反正个数不定..但是剩下的那些也都是原先有的..
说白了,就是函数也可以作为另一个函数的参数。这里 cook,isVegetarian,eat都是函数,它们分别用作map, filter,reduce函数的参数。