函數式編程並非在使用Python時須要考慮的首要問題,它的主要做用在於寫出更爲精確和高效的代碼。python
用函數式的風格寫代碼時,函數應該設計成沒有其它反作用,也就是所謂的純函數:函數接收參數並生成輸出而不保留任何狀態或修改任何不反映在返回值中的內容。express
# 非函數式 a = 0 def increment1(): global a a += 1 # 函數式 def increment2(a): return a + 1
匿名函數,通常用來給map、filter等服務,即用即扔,或者做爲回調函數,傳遞給某些應用。編程
lambda args: expression
冒號左邊是參數,右邊是表達式,並將結果做爲返回值。函數式編程
map接受一個方法和一個集合做爲參數,以集合中的每個元素做爲參數傳入方法,而後把返回值插入到新建立的集合中,最後返回那個新集合。函數
>>> map(lambda s: s * 2, [1,2,3,4,5])[2, 4, 6, 8, 10]
map也能夠接收多個集合做爲參數,這個時候,會從多個集合中依次取出對應元素組成元組傳遞給方法,再將執行結果插入到新的集合中並返回該集合。若是多個集合長度不一致,會以None補上。固然,集合的個數須要與方法參數的個數一致。spa
>>> plus = lambda x,y : (x or 0) + (y or 0) # x or 0 爲防止None和0相加出現異常 >>> map(plus, [1,2,3], [4,5,6]) [5, 7, 9] >>> map(plus, [1,2,3,4], [4,5,6]) [5, 7, 9, 4] >>> map(plus, [1,2,3], [4,5,6,7]) [5, 7, 9, 7]
有種狀況是傳遞給map的func方法爲None,則從集合中取值的過程依然不變,可是會將取值後的結果直接返回。設計
>> map(None, [1,2,3,4]) [1, 2, 3, 4] >>> map(None, [1,2,3,4], [5,6,7,8]) [(1, 5), (2, 6), (3, 7), (4, 8)] >>> map(None, [1,2,3,4], [5,6,7]) [(1, 5), (2, 6), (3, 7), (4, None)] >>> map(None, [1,2,3,4], [6,7,8,9], [11,12]) [(1, 6, 11), (2, 7, 12), (3, 8, None), (4, 9, None)]
reduce接收的參數形式以下:code
reduce(func, iterable[, initializer])
reduce對iterable可迭代對象中的元素從左到右累計運算,initializer爲初始值,若未指定初始值,則將第一個元素做爲初始值,從第二個開始迭代。
對象
>>> plus = lambda x, y : x + y >>> reduce(plus, [1,2,3,4,5]) 15 >>> reduce(plus, [1,2,3,4,5], 10) 25
filter一樣接收一個方法和可迭代的集合對象做爲參數,行爲和map相似,可是filter會從方法執行結果中過濾出值爲True的結果集並返回。
rem
>>> filter(lambda x: x % 2, [1,2,3,4,5,6,7,8,9,10]) [1, 3, 5, 7, 9]