python map函数迭代

时间:2013-05-25 14:27:53

标签: python map

结果是一个嵌套列表,如下所示:

>>> results
[[1, 2, 3, 'a', 'b'], [1, 2, 3, 'c', 'd'], [4, 5, 6, 'a', 'b'], [4, 5, 6, 'c', 'd']]

pr是一个函数,定义如下:

>>> def pr(line):
...     print line

结果的正常迭代确实如下:

>>> for result in results:
...     pr(result)
... 
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'c', 'd']
[4, 5, 6, 'a', 'b']
[4, 5, 6, 'c', 'd']

但是使用map隐式迭代会产生这种行为:

>>> map(pr, results)
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'c', 'd']
[4, 5, 6, 'a', 'b']
[4, 5, 6, 'c', 'd']
[None, None, None, None]

我的问题:为什么map函数会产生额外的迭代?

3 个答案:

答案 0 :(得分:6)

Python 2中的

map返回一个列表,该列表由您传递的函数的所有返回值构成。您的pr函数返回None(隐含地,从结尾处掉落)。因此,map的结果将是一个填充None的列表,一个用于您传入的可迭代中的每个对象。由交互式解释器自动打印,因为您没有分配它变量 - 这是你看到的最后一行。

当您将变量分配给变量时,您可以更清楚地看到它:

>>> a = map(pr, results)
[1, 2, 3, 'a', 'b']
[1, 2, 3, 'c', 'd']
[4, 5, 6, 'a', 'b']
[4, 5, 6, 'c', 'd']
>>> a
[None, None, None, None]

请注意,当您不关心此结果时使用map通常会使您的代码更难阅读;并将其用于副作用更是如此。在这两种情况下,最好编写显式循环。

答案 1 :(得分:6)

map将一个函数应用于iterable的每个元素,并将其结果存储回列表(或Python 3中的map对象)。所以[None, None, None, None]部分是map函数的返回值。执行脚本时不会看到这个,但是你也可以通过将它分配给一个值来消除IDLE:

>>> _ = map(pr, results)

但请注意,结果列表的构造(至少在Python 2中)会产生一些影响,因此如果您不需要结果,那么在这种情况下最好不要使用map

答案 2 :(得分:3)

[None, None, None, None]是调用map的结果,它在Python解释器控制台中自动打印。