结果是一个嵌套列表,如下所示:
>>> 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函数会产生额外的迭代?
答案 0 :(得分:6)
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解释器控制台中自动打印。