python map函数迭代

Ris*_*gar 6 python map

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

>>> results
[[1, 2, 3, 'a', 'b'], [1, 2, 3, 'c', 'd'], [4, 5, 6, 'a', 'b'], [4, 5, 6, 'c', 'd']]
Run Code Online (Sandbox Code Playgroud)

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

>>> def pr(line):
...     print line
Run Code Online (Sandbox Code Playgroud)

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

>>> 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']
Run Code Online (Sandbox Code Playgroud)

但是使用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]
Run Code Online (Sandbox Code Playgroud)

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

lvc*_*lvc 6

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]
Run Code Online (Sandbox Code Playgroud)

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


pok*_*oke 6

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

>>> _ = map(pr, results)
Run Code Online (Sandbox Code Playgroud)

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