在python中,map(func,list)和[func(x)for x in list]之间有什么区别

在python中,map(func,list)和[func(x)for x in list]之间有什么区别,map,python,Map,Python,就我所知,唯一的区别是速度,在定义lambda函数时,你必须有点狡猾 例如: map(lambda x: x + 1, range(4)) == [(lambda x: x + 1)(y) for y in range(4)] 在我看来,第二种方式更像是蟒蛇式的,但我不知道为什么 编辑: 是的,我知道在第二个示例中,lambda将被排除在外,我只是试图显示尽可能等效的代码。正确的方法是 [y + 1 for y in range(4)] 这里不需要构造lambda函数。在列表的每次迭代中,您

就我所知,唯一的区别是速度,在定义lambda函数时,你必须有点狡猾

例如:

map(lambda x: x + 1, range(4)) == [(lambda x: x + 1)(y) for y in range(4)]
在我看来,第二种方式更像是蟒蛇式的,但我不知道为什么

编辑:


是的,我知道在第二个示例中,lambda将被排除在外,我只是试图显示尽可能等效的代码。

正确的方法是

[y + 1 for y in range(4)]
这里不需要构造
lambda
函数。在列表的每次迭代中,您的代码都会不必要地构建一个新的函数对象

也就是说,您可以编写对
map()
的任何调用,作为等效的列表理解。如果
map()
的第一个参数是
lambda
函数,则通常首选列表理解。如果
map()
的第一个参数是函数名,则两个变量都可以。有些人(包括我)更喜欢

map(str, my_list)
而其他人更喜欢

[str(x) for x in my_list]

这没有区别,但python的方法是完全省略lambda:

[y + 1 for y in range(4)]
还要注意,如果映射函数是“内置”(用C编写)函数,而不是python函数或lambda函数,
map
将更快

另一种蟒蛇式但不常见的方式(避免不必要的lambda)是:

map(1 .__add__, range(4)) # thanks to SvenMarnach for this
通常最好在映射表单中避免lambda,因为列表理解总是更有效、更清晰。相比之下,使用多行函数是完全可以接受的——没有办法将它们内联编写,即使可以,也可能不太清楚

另一个区别是,由于
map
可以对多个序列进行映射,并将它们作为位置参数传递给映射函数,因此可以避免列表理解中需要的压缩:

[x+y for x,y in zip(range(4), range(2,6))]
#vs
from operator import add
map(add, range(4), range(2,6))

看,如果你添加了一些条件,映射就需要一个lambda,对吗
[y+1表示范围(4)内的y,如果y>2]
@jdi:对
map()
的调用在这种情况下总是需要
lambda
函数,不是吗?(除非你使用像
map(1.\uuu add\uuu,range(4))
这样的模糊代码。)@SvenMarnach在语法上是无效的(你需要括号),但我认为这是一种很好的表达方式。@Marcin:这在我的解释器中运行。(请注意
1
后面的空格,这确实是需要的。)
map
在您要调用包含多个参数的函数时尤其有用。我更喜欢
map(func,a,b)
而不是
[func(*args)for args in zip(a,b)]
作为旁注,在Python3中,map将创建迭代器而不是列表,所以在使用该语言时要小心。”
map
在某些情况下可能会在显微镜下更快(当您不是为了这个目的而制作lambda,而是在map和listcomp中使用相同的函数时)。在其他情况下,列表理解可能会更快[…]“-来自@RikPoggi True,但仅限于内置函数。Python函数都会受到相同的性能影响。是“map(1.\u add\u,range(4))”真正的pythonic?@placeybordeaux它简洁明了,易于理解