2013-05-25 99 views
6

结果是嵌套列表,看起来像这样:蟒蛇地图功能迭代

>>> 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(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

'map'来自函数式编程语言http://en.wikipedia.org/wiki/Map_%28higher-order_function%29它不应该像这样使用 – jamylak

+2

@jamylak:pr是一个演示函数问题,我在我的代码中应用了其他一些转换。 –

回答

6

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

>>> _ = map(pr, results) 

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

3

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

6

map在Python 2中返回一个列表,该列表由传递它的函数的所有返回值组成。您的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当你不关心这个结果wlil通常使你的代码难以阅读;并使用它更多的副作用。在这两种情况下,最好编写显式循环。