轉自:http://www.jianshu.com/p/7fe3408e6048編程
一、map(func,seq1[,seq2...]) Python 函數式編程中的map()函數是將func做用於seq中的每個元素,並用一個列表給出返回值。若是func爲None,做用通zip().
當seq只有一個時,將func函數做用於這個seq的每個元素上,獲得一個新的seq。
函數式編程
舉個例子來講明,(假設咱們想要獲得一個列表中數字%3的餘數,那麼能夠寫成下面的代碼):函數
>>> print 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]
當seq多於一個時,map均可以並行地對每一個seq執行以下圖所示的過程:spa
下面的例子是求兩個列表對應元素的積,能夠想象,這是一種可能會常常出現的情況,而若是不是用map的話,就要使用一個for循環,依次對每一個位置執行該函數。code
>>> print map(lambda x,y:x*y,[1,2,3],[4,5,6]) >>> [4,10,18] #下面的代碼不止實現了乘法,也實現了加法,並把積與和放在一個元組中。 >>> print map(lambda x,y:(x*y,x+y),[1,2,3],[4,5,6]) >>> [(4,5),(10,7),(18,9)] #當func是None的時候,目的是將多個列表相同的位置的元素歸併到一個元組,在如今已經有了專用的函數zip() >>> print map(None,[1,2,3],[4,5,6]) >>> [(1,4),(2,5),(3,6)] >>> print zip([1,2,3],[4,5,6]) # 須要注意的是,不一樣長度的seq是沒法執行map函數的,會出現類型錯誤
二、reduce( func, seq[, init] ) Python
reduce函數即爲化簡,它是這樣一個過程:每次迭代,將上一次的迭代結果(第一次時爲init的元素,如沒有init則爲seq的第一個元素)與下一個元素一同執行一個二元的func函數。在reduce函數中,init是可選的,若是使用,則做爲第一次迭代的第一個元素使用。
簡單來講,一個形象化的例子:blog
>>> reduce(func,[1,2,3]) = func(func(1,2),3)
舉個例子來講,階乘是一個常見的數學方法,Python中並無給出一個階乘的內建函數,咱們可使用reduce實現一個階乘的代碼:ip
>>> n=5 >>> print reduce(lambda x,y:x*y,range(1,n+1)) >>> 120 #若是想要獲得2倍的階乘的值,那麼就能夠用到init這個可選參數了 m=2 n=5 print reduce(lambda x,y:x*y,range(1,n+1),m)