Python函數式編程 zip map filter reduce詳解

來源:互聯網
上載者:User

Python中有很多函數式編程的方法,本文介紹的是最常見的幾個函數

注:本文基於python2.7.不同的版本可能會導致差異

Zip - 集資

標準格式zip(seq[, seq[, seq]])

舉個栗子:


a = (i for i in range(3))
b = [4, 5, 6]
c = (7, 8, 9)
abc = zip(a, b, c)

abc的結果為[(0, 4, 7), (1, 5, 8), (2, 6, 9)]

所以zip函數的作用已經很明顯了,它就好比abc三家集資,一家出一個.
那當c家很富,a家沒那麼富怎麼辦呢?


a = (i for i in range(2))
b = [4, 5, 6]
c = (7, 8, 9, 10)
abc = zip(a,b,c)

abc三家集資的結果為[(0, 4, 7), (1, 5, 8)],說好的一家出一個,你家沒有了,那我也就不出了(你看,代碼也這麼現實…)
之所以舉的栗子不全是list,就是想說明一個小的注意點,zip接受的都是具有迭代的屬性的參數(__iter__),這個後面會講
Filter - 審查

標準格式filter(func, seq)

舉個栗子:


a = [1, 2, 3]
b = [4, 5, 6]
c = [7, 8, 9]
result = filter(lambda x:sum(x)>14, [a, b, c])
result為[[4, 5, 6], [7, 8, 9]]

現在有一個項目,但是這個項目要有個資產審查,要求資產滿足lambda標準的企業才有資格參加招標(func是一個bool類型的函數)
Map - 招標

標準格式map(func, seq[, seq[, seq]])

舉個栗子:


a = (i for i in range(3))
b = [4, 5, 6]
c = (7, 8, 9)
abc = map(lambda x,y,z: x+y+z, a, b, c)

abc的結果為[11, 14, 17]

還是這個招標的項目lambda函數需要招三家(函數的參數個數)來參與這個項目,這個項目分前中後三期的投入.
假如abc三家幸運的入選,並且三家都已經準備好了三個階段的投入.所以前期a出0,b出4,c出7投入到lambda項目,項目前期返回收入11

依次類推,直到三家的投入全部結束,所以返還的收入就是[11, 14, 17]

假如c有錢(c = [7,8,9,10,11]),c說:老子有錢,我要追加投入. 那ab沒錢怎麼辦?簡單!!ab就誠實的說:老子沒錢 就好了(a = [0,1,2,None,None], b = [4,5,6,None,None])

所以lambda項目就收到到這樣的投入[None,None,10], [None,None,11],這裡要注意處理這些None,因為不小心他就會報NoneType

a = (i for i in range(3))
b = [4, 5, 6]
c = (7, 8, 9, 10, 11)
abc = map(lambda x,y,z: str(x)+str(y)+str(z), a, b, c)
所以abc的結果為['047', '158', '269', 'NoneNone10', 'NoneNone11']

map接受的也都是具有迭代的屬性的參數

注意,當func為None的時候,map的功能就類似與zip了.說到底map也就是先集資(zip)在幹事(func),func不存在的時候就剩集資(zip)了
Reduce - 二次投入

標準格式reduce(func, seq[, init])

舉個栗子:


a = (i for i in range(3))
result = reduce(lambda x,y: x+y, a)
result為3
reduce的工作流程為:
1.func(seq[0], seq[1]) ->seq的第一和第二元素應用到func
2.func(func(seq[0], seq[1]), seq[2]) ->上一步func的結果作為func的第一個參數,seq第三個參數作為func的第二個元素
……
n.func(...func(func(seq[0], seq[1]))...,seq[n]) ->上一步func的結果作為func的第一個參數,seq第n個參數作為func的第二個元素
下圖可以很好的說明這個過程:


                   
以上是init不存在的時候,當init存在的時候,第一步的func的第一個參數為init,seq的第一個元素為func的第二參數,後面流程就一樣了
這就好比把第一階段的盈利當作二次投資的資本在進行投資
結語
在python中函數式編程能很大程度上節約我們的開發時間,利用好了就會是自己的一大利器
文中提到的好比在可能會有不當,畢竟我不是經濟專業的….海涵

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.