都應該了解的Python函數式編程
函數式編程(Functional Programming)或者函數程序設計,是一種編程范型。
它將計算機運算視為數學上的函數運算,并且避免使用程序狀態以及變量對象。
以上只是簡單的函數式編程的概念,我們只需簡單了解即可。
在 Python 中,函數式編程主要由幾個函數的使用構成:lambda()?, map()?, reduce()?, filter()等。
1.lambda 函數
lambda 函數,又成為匿名函數。lambda 函數只能有一個表達式,而不需要寫 return 來返回函數的值。當然,匿名函數也是一個函數對象,同樣可以把匿名函數賦值給一個變量。
也可以把匿名函數作為返回值來返回
可以看出,變量 f 就是一個 lambda 函數類型,需要使用?f()來調用該函數。
2.map函數
map 函數接收兩個參數,一個是函數,一個是 Interable (可迭代序列),map 函數依次將函數作用到序列的每個元素,并把結果作為新的 Interable 返回。
看一個例子:
一個簡單的列表解析,把列表 a 的每個元素都加2,用 map 函數可以寫為:
由于 map 函數返回的是一個惰性序列,需要通過?list()等函數來調用它。
雖然上面的代碼看起來比直接寫 for 循環要復雜,但是當數據量很大的情況下,Python 的 for 效率就不是很高了,而 map 的效率是可以接近 C 語言的。同時代碼也簡潔很多,簡直裝X神器。
另一個小例子,把列表中的元素轉換為字符串,一條命令
3.reduce函數
它和 map 有些像,不過 map 是用于逐一遍歷,而 reduce 函數是用來遞歸計算的。
一個簡單的序列求和
對列表 a 的各個元素依次求和,再看一個自制的int()函數的例子
這是 Python 內置函數 int 的用法
我們通過 reduce 和 map 函數也可以實現如下
先用 map 函數來遍歷 23465 這個字符串列表,然后通過 reduce 函數遞歸應用列表每個元素到 lambda 函數。
4. filter函數
它同樣接收一個函數和一個序列,filter()把傳入的函數依次作用于每個元素,然后根據返回值是 True 還是 False 決定保留還是丟棄該元素。
總結
使用這些函數,不僅可以讓我們的代碼更加簡潔,同時在大數據量或者計算密集時,能夠大大提高效率。