雖然Python中「萬般皆下品,惟有對象高」,但函數式編程也不是不能用,並且Python提供了一些有助於進行函數式編程的函數:map、filter和reduce。python
下面簡單來看下它們的做用:編程
語法:函數式編程
map(f,seq)函數
參數解析:code
f — 函數對象
seq — 序列blog
做用:將序列中全部的元素傳遞給函數。class
這樣獲得的結果是一個Iterator,Iterator是惰性序列,所以經過list()
函數讓它把整個序列都計算出來並返回一個list:import
>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])) ['1', '2', '3', '4', '5', '6', '7', '8', '9']
用於過濾序列,語法同map()相同,用於過濾序列,和map()相似,filter()也接收一個函數和一個序列。和map()不一樣的是,filter()把傳入的函數依次做用於每一個元素,而後根據返回值是True仍是False決定保留仍是丟棄該元素。map
例如:在一個數字序列中[1,2,3,4,5,6,7,8,9,10],取出全部偶數,就能夠這樣寫:
def is_odd(n): return n % 2 == 0 list(filter(is_odd,[1,2,3,4,5,6,7,8,9,10]))
注意filter()的結果也是一個Iterator,故經過list()函數讓它把整個序列都計算出來並返回一個list。
函數reduce()是模塊functools中的,因此須要導入才能用。
語法同map()同樣,可是reduce()的第一個參數fn函數必須接收兩個參數,由於reduce()的做用是使用指定的函數fn將序列的前兩個元素合二爲一,再將結果與第三個元素合二爲一,以此類推,直處處理完整個序列並獲得一個結果。
效果就是:
reduce(fn, [x1, x2, x3, x4]) = fn(fn(fn(x1, x2), x3), x4)
例如:能夠用reduce實現一個求和:
from functools import reduce def add(x,y): return x + y reduce(add, [2,4,6,8,10])
固然就本例而言,徹底不如使用內置的sum。