2013-12-17 36 views
1
>>> map(max, 'spam', 'potato') 
['s', 'p', 't', 'm', 't', 'o'] 

Python的map可能需要多次迭代。爲什麼會出現這種情況,您能否舉一個典型案例來說明需要或有用的案例?另外,對於迭代次數不完全相同的情況,爲什麼2.x填充None,其中3只是截斷 - 某處是否存在PEP,或者有關進行此更改的基本原理的討論?使用具有多個參數的地圖

我通常認爲理解優於map,因爲他們可以在一次打擊中處理filtermap的工作,但仍然清晰可讀。另外,我看到太多的weirdunpythonic解決方案,其中使用map時,list comp是一種明顯的方式。我並不完全理解爲什麼地圖是用語言編寫的,我對功能風格並不瞭解,而且我擔心我會錯過map的一些與多重參數相關的優勢!

+1

圭多實際上有map'的'強烈反感,實際上計劃從蟒蛇3.由於刪除它沒有然而,對於流行的意見,他沒有。 http://www.artima.com/weblogs/viewpost.jsp?thread=98196 –

+0

這是Python的錯誤,lambda的限制太慢。否則,在某些列表理解變得難以閱讀的情況下,「map」會很有用。 –

+3

'map'早於理解。 – user2357112

回答

2

關於爲什麼map截斷在python3,這完全是因爲python3的map實際上是itertools.imap。和文檔說:

map()但在最短的迭代耗盡 而不是None填充較短iterables停止。 的原因 所不同的是無限的迭代器的參數通常爲map()一個 錯誤(因爲輸出被完全評估),但 表示到 imap()供給參數的一個共同的和有用的方法。

截斷允許你做一些事情,比如map(func, itertools.repeat(5), [1,2,3])並迭代結果而不用擔心。與舊的map,這將是一個無限循環。

python3最顯着的變化之一是現在很多內置函數返回生成器而不是list s,包括mapzip。這種「增加的懶惰」改變了這些功能的使用方式,從而改變了行爲。

至於爲什麼會使用python2的多重迭代到map我不知道。當然,這是類似的東西(在python3)的快捷方式:

list(itertools.starmap(function, itertools.zip_longest(*iterables))) 

這可能有一些角落情況下的用法,但我從來沒有見過它用。 也許大多數人甚至不知道map接受一系列的迭代。 因此,AFAIK沒有任何來自使用多個參數的超能力。

至於爲什麼map是在語言中,這是因爲map早在列表解析。在列表解析之前,它對於構建列表非常有用。 這是不是因爲向後兼容性而被刪除,因爲很多人都喜歡它, 雖然Guido did want to remove it

要了解更多有關的mapfilterreduce和其它功能方面的歷史,閱讀:The History of Python: Origins of Python's "Functional" Features

+0

哇,我想我是Python的相對新手,因爲我甚至無法想象沒有理解的語言。它們似乎是python wim

+2

@wim是的,它們是較新python版本的「殺手級特性」之一。 Python <2.0是一種完全不同的語言。特別是python <1.6,其中字符串沒有方法(這就是爲什麼在python2中'string'模塊充滿了'split','strip'等功能)。在過去的10 - 15年裏,這門語言有了很大的提高。 – Bakuriu