說說Python中的幾個內建函式和表推導

發表於2015-08-13

Guido 非常不喜歡lambdamapfilter以及reduce這幾個函數語言程式設計中的函式,他比較喜歡使用表推導。而且出於防止濫用的考慮,lamdba在Python中”享受”到了在其他語言中未曾遇到過的限制。

我個人也很喜歡錶推導,不僅僅是速度快,而且看上去更pythonic,那麼,上面說的幾個函式是不是都可以用表推導代替呢?來做個試驗。

map

最基本的lambda就是一個接受引數返回值的匿名函式,沒有涉及到列舉,就不單獨說了。直接把lambdamap組合起來用,map的作用是將一個函式對映到一個列舉型別上。比如求一個列表中所有值的三次方:

使用表推導:

沒什麼好說的, 表推導更簡潔。注意map外面用了list這是Python3中的語法,因為在Python3中,mapfilter都從返回列表更改為返回迭代器了。

filter

filter返回可迭代物件傳入function後返回值為True的item。

例如,返回一個列表中只含有字母的元素:

使用表推導

嗯,看上去還是表推導更好看,更容易理解

reduce

reduce稍微複雜一些,reduce是一種類似向左摺疊列表的操作,按照可迭代物件的順序迭代呼叫函式。並且要求函式接受兩個引數。如果有第三個引數,則表示初始值。

一個簡單的例子,求10的階乘:

reduce還接受第三個引數,作為初始值,有時候我們是一定需要第三個引數的,例如在一段文字中查詢某個單詞出現的次數:

如果不使用預設值,第一個值就是大寫字母’I’,顯然不能用於計算出現的次數。

這種左乘的迭代操作,並不適合用表推導來實現。

當然為了表示我對錶推導的支援,我把上面第二個reduce例子,用表推導實現了一下:

然而這並沒有什麼luan用,因為迭代求和求乘積的,還是reduce更好用。

apply

apply在Python3中已經被移除了,統一使用*將列表中的值作為引數傳入。

結論

綜上,表推導可以完全替代mapfilter並且更簡潔,但是不適用於reduce

相關文章