說說 Python 中的高階函數

高階函數(higher-order function)指的是:接受一個函數爲參數,或者把函數做爲結果值返回的函數。網絡

1 sorted()

比較常見的高階函數是 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],也就是從最後一個元素到第一個元素複製一遍,即把這個單詞倒序處理3it

2 弱化的 map 與 filter 函數

由於列表推導能夠替代 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 函數,列表推導形式下的代碼顯得更加簡潔。

3 弱化的 reduce() 函數

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 內置函數實現的功能,儘可能採用內置函數來實現。


本文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,若有問題請及時聯繫咱們以做處理

想要獲取更多Python學習資料能夠加QQ:2955637827私聊或加Q羣630390733你們一塊兒來學習討論吧!
相關文章
相關標籤/搜索