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

2020-12-03 素食先生lpt

什麼是高階函數?

高階函數是一種將函數作為參數,或者把函數作為結果返回的函數,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都有相應的替代品。因此,對其進行清楚的認識非常重要。從中也可以直到,列表推導、生成器表達式在應用方面的重要性。

相關焦點

  • Python零基礎入門教程,如何使用lambda、filter和map函數?
    大綱函數類型定義及特性lambda函數定義及使用filter函數定義及使用map函數定義及使用引入函數類型概念函數類型定義:python中任意一個函數都有數據類型,這種數據類型是function(函數類型)
  • Python基礎教程——高階函數
    Python的高階函數,就是map、filter、reduce,說它們是高階函數,只是因為我們平時用的少,所以理解起來也有點費勁,事實上,它們功能很強大,也很好用易用。一起來看看吧。平方函數例1:多個數字組成的一個列表,我們想要對每個數字都乘以2,雖然使用for循環也能完成,但是明顯太繁瑣,使用map這個高階函數,就簡單多了。代碼如下:
  • 寫Python 代碼不可不知的函數式編程技術
    接受函數作為輸入或返回函數的函數叫做高階函數,它是函數式編程的重要組成部分。高階函數具備強大的能力。就像《Eloquent JavaScript》中解釋的那樣:「高階函數允許我們對動作執行抽象,而不只是抽象數值。」我們來看一個例子。假設我們想對一個項目列表(list of items)執行迭代,並將其順序列印出來。
  • Python數據分析常用高階函數大全
    這裡需要注意的是 ,map()直接返回的是一個<map at 0x205ef31fb00>的對象我們需要利用list函數將它裡邊的元素釋放出來。與此同時,map函數的好朋友就是lambda,lambda匿名函數經常作為map的第一個參數進行組合使用例如print(list(map(lambdax:x*3,l)))返回的結果依舊是[0, 3, 6, 9, 12, 15]zipzip()將多個可迭代對象的元素組合成為為一個元組序列l=
  • 「數據清洗」lambda表達式配合使用的四種函數
    標籤:數據清洗、pythonlambda表達式配合使用的四種函數一、什麼是lambda表達式基本特性使用方法filter函數map函數sorted函數reduce函數總結什麼是lambda表達式filter函數:篩選列表中所有滿足條件的元素,lambda函數作為過濾列表元素的條件。map函數:根據提供的函數對指定序列做映射,lambda函數作為映射。
  • Python學習,這些高階函數和高階特性值得一學
    解決問題的思路有的時候會比較單一,其實Python有很多靈活的解法,比如python的幾個高階函數或者特性!推導式列表推導式,使用一句表達式構造一個新列表,可包含過濾、轉換等操作。語法:{key_exp:value_exp for item in collection if codition}集合推導式語法:{exp for item in collection if codition}map函數map(fun, lst),將傳入的函數變量func作用到lst變量的每個元素中,並將結果組成新的列表返回
  • Python的一行代碼有何魅力?lambda匿名函數都自嘆不如
    一行代碼我們都知道,創建列表的方式有多種,比如直接定義、使用list()函數轉換、使用for循環迭代輸出等等。不知道你們有沒有發現,當定義某種列表時,如果使用for循環迭代輸出的話,會讓代碼變得複雜,需要很多行代碼才能實現這一功能。
  • Python小白學習記錄-匿名函數lambda
    匿名函數就是不需要通過def定義及顯示地指定函數名的函數匿名函數的特性(1)匿名函數只能有一個表達式,不用寫return,返回值就是該表達式的結果。(2)匿名函數沒有名字,不必擔心函數名衝突。(3)匿名函數也是一個函數對象,可以把匿名函數賦值給一個變量,再利用變量來調用該函數。(4)有些函數在代碼中只用一次,而且函數體比較簡單,不需要賦值給變量,直接調用可以減少代碼量,看起來比較」優雅「。
  • Python最重要的5大功能,要是能早點了解就好了!
    conda create -n venv pippython=3.7 # select python versionsource activate venv...source deactivate因此,為每個應用程式創建單獨的虛擬環境venv至關重要,可以用 pip或conda完成。3.
  • 分享幾個javascript實用函數
    // 使用Array.prototype.map()和Array.prototype.join(delimiter)// 將各個1D數組(行)組合成字符串。使用Array.prototype.join('\ n')// 將所有行組合成CSV字符串,分隔 每行都有一個換行符。省略第二個參數delimiter,使用默認的分隔符。
  • 打基礎一定要吃透這12類 Python 內置函數
    內置函數就是python給你提供的, 拿來直接用的函數,比如print.,input等。截止到python版本3.6.2 python一共提供了68個內置函數,我將它們分成 12 類,方便你學習。1. 和數字相關1.
  • python:pop函數詳解 - 二進位01
    pop函數詳解今天我為大家講解python中pop函數的使用。#簡介——pop()函數是python解釋器的內置方法,可作用於列表,字典。用法說明——在builtins.py中找到pop函數。列表:L.pop([index]) -> item -- remove and return item at index (default last).
  • 打工人打工魂,打工的必會java調用python的幾種用法
    程序中函數傳遞參數並執行出結果,下面我就舉一例來說明一下。而sys.argv[0]代表python程序名,所以列表從1開始讀取參數。以上代碼實現一個兩個數做加法的程序,下面看看在java中怎麼傳遞函數參數,代碼如下:int a = 18;int b = 23;try {String[] args1 = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) }; Process proc = Runtime.getRuntime
  • Python每天一分鐘:lambda表達式 (匿名函數)及用法詳解
    lambda表達式介紹python中有一種靈活,便捷的且具有函數功能的表達式:lambda表達式!python lambda表達式如果說函數是命名的、便於復用的代碼塊,那麼lambda 表達式則是功能更靈活的代碼塊
  • python入門基礎之lambda匿名函數詳解
    python入門基礎之lambda匿名函數詳解剛開始學習python的時候很多人可能對於lambda函數不了解,感覺和def很混亂,下面我來介紹一下lambda函數我從一下幾個方面來介紹lambda:lambda作為一個表達式,定義了一個匿名函數,上例的代碼x,y為入口參數,x+y為函數體。在這裡lambda簡化了函數定義的書寫形式。python允許用lambda關鍵字創造匿名函數。匿名是不需要以標準的方式來聲明,比如說使用 def 語句。(除非賦值給一個局部變量,這樣的對象也不會在任何的名字空間內創建名字,上面的例子中會創建名字。)
  • Python編程常見問題與解答
    答:如果是Windows系統的話,可以使用瀏覽器打開https://www.lfd.uci.edu/~gohlke/pythonlibs/下載合適版本的whl文件,然後離線安裝。9.問:map對象不支持下標嗎?為什麼使用下標訪問其中的元素時提示「TypeError: 'map' object is not subscriptable」呢?答:是的,map對象、enumerate對象、zip對象、filter對象、reversed對象和生成器對象這些具有惰性求值特點的對象都不支持使用整數下標訪問其中的元素。
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 7款 Python 工具,讓你在工作上更佔優勢!
    這裡有7款python工具,是所有數據專家必不可少的工具。當你對他們有一定了解後,會成為你找工作的絕對優勢!下面就了解它們一下吧:0.IPythonIPython是一個基於Python Shell的交互式解釋器,但是有比默認Shell強大得多的編輯和交互功能。