2013-09-22 44 views
19

我正在通過Python文檔閱讀,以便深入瞭解Python語言並發現了過濾器和映射函數。我之前使用過濾器,但從未映射過,儘管我已經在SO上看到過各種Python問題。Python:過濾器(函數,序列)和映射(函數,序列)之間的區別

在Python教程中閱讀了關於它們之後,我對兩者之間的區別感到困惑。例如,從5.1.3. Functional Programming Tools

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
... 
>>> filter(f, range(2, 25)) 
[5, 7, 11, 13, 17, 19, 23] 

>>> def cube(x): return x*x*x 
... 
>>> map(cube, range(1, 11)) 
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000] 

這些看上去幾乎一模一樣的功能同樣給我,讓我去到終端以交互方式運行Python和測試了我自己的情況。對於上面的第一個和第二個實例,我使用了map,對於第一個(return x % 2 != 0 and x % 3 != 0),它返回了一個布爾值列表而不是數字。

爲什麼map有時會返回一個布爾值和其他時間的實際返回值?

有人可以向我解釋完全區別mapfilter

回答

24
map(cube, range(1, 11)) 

相當於

[cube(1), cube(2), ..., cube(10)] 

雖然通過

filter(f, range(2, 25)) 

返回的列表中運行使用時

result = [] 
for i in range(2, 25): 
    if f(i): 
     result.append(i) 

通知後相當於,結果中的項目是由函數cube返回的值。

相比之下,ffilter(f, ...)中返回的值不是result中的項目。 f(i)僅用於確定如果i應保存在result

12

filter(),正如其名稱所示,過濾原始的可迭代項,並提供返回True的項目,以提供給filter()的功能。

map()另一方面,將提供的函數應用於迭代器的每個元素並返回每個元素的結果列表。

遵循你給了,讓我們來比較它們的例子:

>>> def f(x): return x % 2 != 0 and x % 3 != 0 
>>> range(11) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
>>> map(f, range(11)) #the ones that returns TRUE are 1, 5 and 7 
[False, True, False, False, False, True, False, True, False, False, False] 
>>> filter(f, range(11)) #So, filter returns 1, 5 and 7 
[1, 5, 7] 
+0

現在是有道理的,我看到的過濾條件如何表明該函數與圖什麼。 – samrap

+1

實際上'map()'這個名字也是有意義的,在某些字段中,當map用作動詞時,它意味着找到1對1的對應關係。如在數學中:'map x to y'或在遺傳學中:'將糖尿病映射到基因'。關於Python的一件好事就是這樣的:名字通常是有意義的。 –

+0

這是一個很好的觀點。有趣的是,編程的某些方面與日常例子相似。就像我在代數2中一樣,我們正在學習函數f(x),並且一半的課都被困住了,但這個想法與編程中的函數100%相似。 – samrap

相關問題