天天看點

python高階函數_python高階函數:map、filter、reduce的替代品

python高階函數_python高階函數:map、filter、reduce的替代品
python高階函數_python高階函數:map、filter、reduce的替代品

什麼是高階函數?

python高階函數_python高階函數:map、filter、reduce的替代品

高階函數是一種将函數作為參數,或者把函數作為結果傳回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的内置函數,它的可選參數key用于提供一個函數,它可以将函數應用到各個元素上進行排序。

根據單詞長度,使用sorted函數對一個清單進行排序。其中将len函數傳給key參數,具體示例如下:

python高階函數_python高階函數:map、filter、reduce的替代品

這裡需要特别提示一下,任何單參數函數都能作為key參數的值。

在函數式程式設計中,大家最熟悉的高階函數主要有map函數、filter函數、reduce函數和apply函數。

python3中移除了apply。如果想使用不定量的參數調用函數,可以使用fn(*args,**keywords),不用再使用apply(fn,args,keywords)。

雖然map函數、filter函數、reduce函數還能使用,但是很多場景下其都有替代品可以使用。

map、filter、reduce的替代品

python高階函數_python高階函數:map、filter、reduce的替代品

函數式程式設計語言一般都會提供map、filter、reduce三個高階函數。python3中前兩個是内置函數,但是因為其引入了清單推導和生成器表達式,它們也就變得沒有那麼重要了,因為其具有了可替代性。接下來,我們一起來看一下,如何使用清單推導和生成器表達式替代map、filter函數。

1.使用清單推導替代map和filter函數

python代碼:

In [1]:def factorial(n):

return 1 if n < 2 else n * factorial(n-1)

In [2]:fact=factorial

#使用清單推導替代map

In [3]: list(map(fact,range(6)))

Out[3]: [1, 1, 2, 6, 24, 120]

In [4]: [fact(n) for n in range(6)]

Out[4]: [1, 1, 2, 6, 24, 120]

#使用清單推導替代map和filter函數

In [5]: list(map(factorial,filter(lambda n : n % 2,range(6))))

Out[5]: [1, 6, 120]

In [6]: [factorial(n) for n in range(6) if n % 2]

Out[6]: [1, 6, 120]

通過上述結果可知,使用清單推導替代map和filter函數,結果一緻的情況下,讓代碼更易讀。易讀的好處是代碼的可維護性更強。

是以,在學習python高階函數的時候,需要清楚什麼是清單推導和生成器表達式,除此之外,還有字典推導等。小編在過往的文章中也分享來清單推導、生成器表達式和字典推導的相關知識及其對比,感興趣的朋友可以查閱一下。

2.内置函數reduce方法的替代品

同樣,reduce是python的内置函數,被放在python3中的functools子產品中。reduce函數主要用于求和。而目前最好使用的内置求和函數是sum,其性能和可讀性上有了重大提升。

python高階函數_python高階函數:map、filter、reduce的替代品

sum和reduce的主要思路是把某個操作連續應用到序列到元素上,累計之前到結果,然後把一系列的值歸結成為一個值。

總結

通過上述的内容可知,在高階函數中,map、filter、reduce都有相應的替代品。是以,對其進行清楚的認識非常重要。從中也可以直到,清單推導、生成器表達式在應用方面的重要性。

python高階函數_python高階函數:map、filter、reduce的替代品

繼續閱讀