2013-05-25 132 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通常使你的代碼難以閱讀;並使用它更多的副作用。在這兩種情況下,最好編寫顯式循環。