1. 程式人生 > >Python學習筆記:函數語言程式設計工具

Python學習筆記:函數語言程式設計工具

本篇參考官方文件: The PythonTutorial:5.Data Structures
函數語言程式設計可以大大簡化程式碼,本篇學習一下三個對list操作非常有用的函式: filter(),map(),reduce()

filter

filter(function, sequence)返回一個由序列(sequence)中使得function(item)為真的元素(item)組成的組成的序列。如果這個序列是str,unicodetuple,結果還是一樣的型別。否則,結果都會變成列表。例如,計算一個能被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函式可以把一些簡單的遞迴用非常簡潔的程式碼解決。