Python學習筆記:函數語言程式設計工具
阿新 • • 發佈:2019-02-13
本篇參考官方文件: The PythonTutorial:5.Data Structures
函數語言程式設計可以大大簡化程式碼,本篇學習一下三個對list操作非常有用的函式: filter(),map(),reduce()
filter
filter(function, sequence)
返回一個由序列(sequence)中使得function(item)
為真的元素(item)組成的組成的序列。如果這個序列是str,unicode
或tuple
,結果還是一樣的型別。否則,結果都會變成列表。例如,計算一個能被3或5整除的sequence:
>>> def f
(x): return x % 3 == 0 or x % 5 == 0 ... >>> filter(f, range(2, 25)) [3, 5, 6, 9, 10, 12, 15, 18, 20, 21, 24]
map
map(function, sequence)
對每個序列中的元素呼叫function(item)
,然後返回一個返回值列表。比如,計算一個立方:
>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125
, 216, 343, 512, 729, 1000]
map
可接收不止一個序列。那麼這個函式的引數個數就必須跟序列個數相同,而且函式作用於幾個序列中的相應元素(或者如果一個序列短於另一個,就返回None
)。例如:
>>> def cube(x): return x*x*x ... >>> map(cube, range(1, 11)) [1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
reduce
reduce(function, sequence)
返回單個值,這個值是由一個二元函式,先作用於序列的前兩個元素,得到的結果再作用於第三個元素,以此類推得到。例如,計算1到10的和:
>>> def add(x,y): return x+y ... >>> reduce(add, range(1, 11)) 55
如果序列中只有一個元素,就返回它。如果序列是空的,就丟擲異常。
reduce
可接收第三個引數來表示開始值(starting value)。在這種情況下如果序列是空的就返回開始值。函式先作用於開始值和序列的第一個元素,以此類推。例如:
>>> def sum(seq): ... def add(x,y): return x+y ... return reduce(add, seq, 0) ... >>> sum(range(1, 11)) 55 >>> sum([]) 0
這三個函式中,只有reduce
比較難懂。在純函數語言程式設計語言Haskell中也有類似的函式,叫foldr
,顧名思義,就是“向右摺疊”,是不是很形象呢?reduce
函式可以把一些簡單的遞迴用非常簡潔的程式碼解決。