Python函數式編程——map()、reduce()

來源:互聯網
上載者:User

標籤:公司   for迴圈   相同   解析   tran   theme   str   參考文獻   處理   

 

文章來源:http://www.pythoner.com/46.html

 

提起map和reduce想必大家並不陌生,Google公司2003年提出了一個名為MapReduce的編程模型[1],用於處理大規模海量資料,並在之後廣泛的應用於Google的各項應用中,2006年Apache的Hadoop項目[2]正式將MapReduce納入到項目中。

好吧,閑話少說,今天要介紹的是Python函數式編程中的另外兩個內建函數map()reduce(),而不是Google的MapReduce。

1.map()

格式:map( func, seq1[, seq2...] )

Python函數式編程中的map()函數是將func作用於seq中的每一個元素,並用一個列表給出傳回值。如果func為None,作用同zip()

當seq只有一個時,將func函數作用於這個seq的每個元素上,得到一個新的seq。說明了只有一個seq的時候map()函數是如何工作的(本文圖片來源:《Core Python Programming (2nd edition)》)。

可以看出,seq中的每個元素都經過了func函數的作用,得到了func(seq[n])組成的列表。

下面舉一個例子進行說明。假設我們想要得到一個列表中數字%3的餘數,那麼可以寫成下面的代碼。

 

Python函數式編程之map使用(一個seq)     Python 
123456 # 使用mapprint map( lambda x: x%3, range(6) )  # [0, 1, 2, 0, 1, 2] #使用列表解析print [x%3 for x in range(6)]  # [0, 1, 2, 0, 1, 2] 

 

這裡又和上次的filter()一樣,使用了列表解析的方法代替map執行。那麼,什麼時候是列表解析無法代替map的呢?

原來,當seq多於一個時,map可以並行地對每個seq執行如所示的過程:

也就是說每個seq的同一位置的元素在執行過一個多元的func函數之後,得到一個傳回值,這些傳回值放在一個結果清單中。

下面的例子是求兩個列表對應元素的積,可以想象,這是一種可能會經常出現的狀況,而如果不是用map的話,就要使用一個for迴圈,依次對每個位置執行該函數。

 

Python函數式編程之map使用(多個seq)     Python 
1 print map( lambda x, y: x * y, [1, 2, 3], [4, 5, 6] )  # [4, 10, 18]

 

上面是傳回值是一個值的情況,實際上也可以是一個元組。下面的代碼不止實現了乘法,也實現了加法,並把積與和放在一個元組中。

 

Python函數式編程之map使用(多個seq)     Python 
1 print map( lambda x, y: ( x * y, x + y), [1, 2, 3], [4, 5, 6] )  # [(4, 5), (10, 7), (18, 9)]

 

還有就是上面說的func是None的情況,它的目的是將多個列表相同位置的元素歸併到一個元組,在現在已經有了專用的函數zip()了。

 

Python函數式編程之map使用(func為None)     Python 
123 print map( None, [1, 2, 3], [4, 5, 6] )  # [(1, 4), (2, 5), (3, 6)] print zip( [1, 2, 3], [4, 5, 6] )  # [(1, 4), (2, 5), (3, 6)]

 

需要注意的是,不同長度的多個seq是無法執行map函數的,會出現類型錯誤。

2.reduce()

格式:reduce( func, seq[, init] )

reduce函數即為化簡,它是這樣一個過程:每次迭代,將上一次的迭代結果(第一次時為init的元素,如沒有init則為seq的第一個元素)與下一個元素一同執行一個二元的func函數。在reduce函數中,init是可選的,如果使用,則作為第一次迭代的第一個元素使用。

簡單來說,可以用這樣一個形象化的式子來說明:
reduce( func, [1, 2,3] ) = func( func(1, 2), 3)

下面是reduce函數的工作過程圖:

舉個例子來說,階乘是一個常見的數學方法,Python中並沒有給出一個階乘的內建函數,我們可以使用reduce實現一個階乘的代碼。

 

Python函數式編程之reduce使用     Python 
12 n = 5print reduce(lambda x, y: x * y, range(1, n + 1))  # 120

 

那麼,如果我們希望得到2倍階乘的值呢?這就可以用到init這個選擇性參數了。

 

Python函數式編程之reduce使用     Python 
123 m = 2n = 5print reduce( lambda x, y: x * y, range( 1, n + 1 ), m )  # 240

 

3.參考文獻

[1] Lammel R. Google’s MapReduce programming model – Revisited[J]. Science of Computer Programming, 2008,70(1):208-237.
[2] Hadoop[EB/OL]. http://hadoop.apache.org.

Python函數式編程——map()、reduce()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.