![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyQ2M2QmN0IjZyU2M3UTM2EzY2MGO3Q2YmRTNkVzM0IWPuV2avR3PnVGcq5SNiFzYmhzM5UDMiVGZyUWYzY2Y0EGO4kzYllTYmRWMxMmM3UzMkNjZvwFZlVmZvwVbvNmL1RWahJmL1M3YpB3Lc9CX6MHc0RHaiojIsJye.jpeg)
什麼是高階函數?
高階函數是一種将函數作為參數,或者把函數作為結果傳回的函數,map函數、sorted函數就是高階函數的典型例子。map函數在小編以前的文章中做過相應的知識分享。sorted函數是python的内置函數,它的可選參數key用于提供一個函數,它可以将函數應用到各個元素上進行排序。
根據單詞長度,使用sorted函數對一個清單進行排序。其中将len函數傳給key參數,具體示例如下:
這裡需要特别提示一下,任何單參數函數都能作為key參數的值。
在函數式程式設計中,大家最熟悉的高階函數主要有map函數、filter函數、reduce函數和apply函數。
python3中移除了apply。如果想使用不定量的參數調用函數,可以使用fn(*args,**keywords),不用再使用apply(fn,args,keywords)。
雖然map函數、filter函數、reduce函數還能使用,但是很多場景下其都有替代品可以使用。
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,其性能和可讀性上有了重大提升。
sum和reduce的主要思路是把某個操作連續應用到序列到元素上,累計之前到結果,然後把一系列的值歸結成為一個值。
總結
通過上述的内容可知,在高階函數中,map、filter、reduce都有相應的替代品。是以,對其進行清楚的認識非常重要。從中也可以直到,清單推導、生成器表達式在應用方面的重要性。