高階函數(higher-order function)指的是:接受一個函數爲參數,或者把函數做爲結果值返回的函數。網絡
比較常見的高階函數是 sorted(),其內部的關鍵字參數 key 能夠接受一個函數爲參數,來指定值的排序規則。函數
好比一個單詞列表,若是給關鍵字參數 key 賦予一個 len 函數,就可讓這個列表按照單詞的長度進行排序。學習
animals = ['ox', 'giraffe', 'mouse', 'tiger', 'lion', 'deer', 'goose']
r = sorted(animals, key=len)
logging.info('r -> %s', r)
複製代碼
運行結果:spa
INFO - r -> ['ox', 'lion', 'deer', 'mouse', 'tiger', 'goose', 'giraffe']
複製代碼
從輸出結果中能夠看到,單詞越長,排越後。code
能夠把各個單詞反過來拼寫,而後排序,就能夠建立押韻詞典。好比 mouse 與 goose,它們的尾音相同,就稱爲押韻詞。所謂的押韻詞典就是把這些詞排在一塊兒。排序
def reverse(word):
return word[::-1]
logging.info('r -> %s', r)
r = sorted(animals, key=reverse)
複製代碼
運行結果:圖片
INFO - r -> ['giraffe', 'goose', 'mouse', 'lion', 'deer', 'tiger', 'ox']
複製代碼
先定義一個單詞倒序 reverse() 函數,這個函數利用 word[::-1]
實現倒序。word[::-1]
至關於 word[-1:-len(word)-1:-1]
,也就是從最後一個元素到第一個元素複製一遍,即把這個單詞倒序處理3。it
由於列表推導能夠替代 map 與 filter 函數所實現的功能,因此已經被弱化了。io
map() 函數語法:map(function, iterable, ...)
,map 會以參數序列中的每個元素來調用 function 函數,並把每次 function 函數的返回值做爲新列表的元素。function
下面的示例說明了 map 與 filter 函數的基本用法,它們都有相應形式的列表推導替換寫法。
def multi3(x):
return 3 * x
r = list(map(multi3, range(6)))
logging.info('r -> %s', r)
r = [multi3(n) for n in range(6)]
logging.info('r -> %s', r)
r = list(map(multi3, filter(lambda n: n % 2, range(6))))
logging.info('r -> %s', r)
r = [multi3(n) for n in range(6) if n % 2]
logging.info('r -> %s', r)
複製代碼
運行結果:
INFO - r -> [0, 3, 6, 9, 12, 15]
INFO - r -> [0, 3, 6, 9, 12, 15]
INFO - r -> [3, 9, 15]
INFO - r -> [3, 9, 15]
複製代碼
示例中首先定義了一個 multi3 函數,該函數會把入參乘以 3 後再返回回來。filter 函數中定義了一個 lambda 表達式來過濾出奇數。 表達式 n % 2
求餘數,若是是奇數則返回 1;若是是偶數則返回 0。由於 if 1
返回 true, if 0
返回 false,因此這裏不須要顯式 return。能夠看到相對於 filter 函數,列表推導形式下的代碼顯得更加簡潔。
reduce() 函數語法:reduce(function, iterable[, initializer])
。其中的 function 函數有兩個參數。reduce() 函數會先對集合中的第 一、2 個元素進行 function 函數處理,獲得的結果再與第三個元素進行 function 函數處理,最後獲得一個結果。這個函數最經常使用於求和,如今有更好的內置 sum()
函數能夠實現相同功能,並且可讀性更好。
from functools import reduce
from operator import add
r = reduce(add, range(100))
logging.info('r -> %s', r)
r = sum(range(100))
logging.info('r -> %s', r)
複製代碼
運行結果:
INFO - r -> 4950
INFO - r -> 4950
複製代碼
一樣的累加求和功能,明顯 sum() 函數代碼更簡潔。
能用 Python 內置函數實現的功能,儘可能採用內置函數來實現。