6

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

>>> 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 函数会产生额外的迭代?

4

3 回答 3

6

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

>>> _ = map(pr, results)

但请注意,结果列表的构造(至少在 Python 2 中)有一些影响,所以如果您不需要结果,最好不要map在这种情况下使用。

于 2013-05-25T14:32:04.660 回答
5

map在 Python 2 中返回一个列表,由您传递给它的函数的所有返回值组成。你的pr函数返回None(隐含地,从最后掉下来)。因此,结果map将是一个充满Nones 的列表,一个用于您传入的可迭代对象中的每个对象。这将由交互式解释器自动打印,因为您没有将其分配给变量 - 这是您的最后一行正在看。

当您将其分配给变量时,您可以更清楚地看到这一点:

>>> 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当您不关心此结果时使用通常会使您的代码更难阅读;并将其用于副作用更是如此。在这两种情况下,最好编写显式循环。

于 2013-05-25T14:31:47.983 回答
3

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

于 2013-05-25T14:31:40.000 回答