首頁 > 軟體

一文詳解Python中的Map,Filter和Reduce函數

2022-08-22 14:01:10

1. 引言

本文重點介紹Python中的三個特殊函數Map,Filter和Reduce,以及如何使用它們進行程式碼程式設計。在開始介紹之前,我們先來理解兩個簡單的概念高階函數和Lambda函數。

2. 高階函數

把函數作為引數傳入,這樣的函數稱為高階函數,函數語言程式設計就是指這種高度抽象的程式設計正規化。

舉例如下:

def higher(your_function, some_variable):
return your_function(some_variable)

實質上,函數map,filter和reduce均為高階函數,它們的輸入引數為函數和可迭代物件(list,tumple等),具體形式如下:

map(your_function, your_list)
filter(your_function, your_list)
reduce(your_function, your_list)

3. Lambda表示式

Lambda 函數類似於普通的 Python 函數,區別在於我們必須為普通函數命名,但對於 lambda 函數,它是可選的。

具體語法如下:

lambda inputs: output

接下來,讓我們看一下幾個普通函數及其 lambda 函數等效實現,如下:

def multiply2(x):           # is the same as
    return x * 2
multiply2 = lambda x: x*2   # lambda function

另一個例子如下:

def add(a, b): # is the same as
return a + b
add = lambda a,b: a+b # lambda function

4. Map函數

Map 用於迭代可可迭代物件中的每個元素進行相應的轉換操作。 例如,通過將 ​​[1,2,3]​​ 中的每個元素乘以 2,將 ​​[1,2,3] ​​變換為 ​​[2,4,6]​​。 為此,我們需要一個lambda函數,該函數用於實現將單個元素乘2的操作,如下:

before = [1,2,3]
after = list(map(lambda x:x*2, before))
# after is [2,4,6]

此外,我們在看下個範例,主要用於將字串所有字元轉換為大寫形式。

如下:

before = ["apple", "orange", "pear"]
after = list(map(lambda x:x.upper(), before))
# after is ["APPLE", "ORANGE", "PEAR"]

需要注意的是,雖然上述 lambda 函數中使用變數 x,但只要它是有效的變數名稱,我們可以更換為任何我們想要取的變數名稱。

5. Filter函數

過濾器用於可迭代,以僅保留滿足特定條件的某些元素。例如,僅將奇數保留在 [1,2,3,4,5,6] 內並得到 [1,3,5]。在這裡,我們需要一個lambda函數,它接受一個數位,如果數位是奇數,則返回True,否則返回False。

函數Filter主要功能為對於根據特定過濾條件來從可迭代物件中的選擇相應的元素。舉例,對於列表​​[1,2,3,4,5,6]​​,如果我們想要過濾得到其中的奇數數元素。我們可以實現一個lambda函數,當引數為奇數時為True,否則為False。

程式碼如下:

before = [1,2,3,4,5,6]
after = list(filter(lambda x:x%2==1, before))
# after is [1,3,5]

在舉個栗子,實現只保留字串長度大於等於5的,即將列表​​[“apple”,“orange”,“pear”]​​轉換為​​[“apple”,“orange”]​​。此時我們可以實現一個lambda函數,接收一個字串,如果該字串的長度大於等於5,則返回True,否則為False。 程式碼如下:

before = ["apple", "orange", "pear"]
after = list(filter(lambda x:len(x)>=5, before))
# after is ["apple", "orange"]

6. Reduce函數

函數Reduce主要用於以某種方式來組合可迭代物件中的所有元素。 與函數​​map​​和​​filter​​不同,我們需要單獨引入​​ reduce​​,如下所示:

from functools import reduce

此外,reduce中使用的lambda函數需要兩個引數,它主要用於告訴我們如何將兩個元素組合成起來。舉個栗子,假如我們需要將列表​​[1,2,3,4,5]​​中的所有元素進行相乘得到數位​​120​​,這裡我們需要實現的lambda函數就是接收兩個數位,並將他們相乘。 程式碼範例如下:

from functools import reduce
before = [1,2,3,4,5]
after = reduce(lambda a,b: a*b, before)
# after is 120

另外一個例子,如果我們需要使用​​-​​來將字串連線起來。具體為將列表​​["apple", "orange", "pear"]​​變成​​"apple-orange-pear"​​。這裡,我們需要實現一個lambda函數,它接受2個字串,並將它們用一個​​-​​字元相加。

程式碼實現如下:

from functools import reduce
before = ["apple", "orange", "pear"]
after = reduce(lambda a,b: a+"-"+b, before)

7. 總結

本文從高階函數和Lambda函數入手,先後介紹了Map,Filter和Reduce三個高階函數的用法,並給出了相應的程式碼範例。

到此這篇關於一文詳解Python中的Map,Filter和Reduce函數的文章就介紹到這了,更多相關Python Map,Filter,Reduce內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com