如何在 Python 中使用 Lambda 函数 [With Examples]

Python 中的 Lambda 函數詳解:語法、範例與應用

本教學將深入探討 Python 中的 lambda 函數,從其基本語法到多種實際應用場景,並搭配程式碼範例進行說明。

在 Python 中,lambda 函數是一種語法簡潔的匿名函數,它能與其他內建函數完美搭配。閱讀完本教學,您將能掌握如何定義 lambda 函數,並了解在何種情況下,lambda 函數會比傳統 Python 函數更為適用。

讓我們開始吧!

Python Lambda 函數:語法與範例

以下是 Python 中定義 lambda 函數的通用語法:

lambda 參數(s): 返回值

在上述語法中:

  • lambda 是一個關鍵字,用於定義 lambda 函數,後接函數接受的一個或多個參數。
  • 冒號用於分隔參數和返回值。

💡 謹記,lambda 函數的返回值必須透過計算單行程式碼的表達式得出。在接下來的範例中,您將更容易理解這一點。

Python Lambda 函數範例

理解 lambda 函數的最佳方法,是從將傳統 Python 函數改寫為 lambda 函數開始。

👩🏽‍💻 您可以在 Python REPL 或線上 Python 編輯器中編寫程式碼。

範例 1. 考慮以下函數 square(),它接受一個數字 num 作為參數,並返回該數字的平方。

def square(num):
    return num * num

您可以使用參數呼叫該函數並驗證它是否正常運作。

>>> square(9)
81
>>> square(12)
144

為了使函數定義更簡潔,您可以將此 lambda 表達式賦值給一個變數名稱,例如 square1square1 = lambda num: num*num。之後,您可以以任何數字作為參數呼叫 square1 函數。然而,lambda 函數本質上是匿名函數,因此不應將其賦值給變數。

對於 square() 函數,參數為 num,返回值為 num*num。掌握這些後,我們可以將其代入 lambda 表達式,並使用參數呼叫它,如下所示:

>>> (lambda num: num*num)(2)
4

這就是立即呼叫函數表達式的概念,我們在定義函數後立即呼叫它。

範例 2. 接下來,我們改寫另一個簡單函數 add(),它接受數字 num1num2,並返回它們的和 num1 + num2

def add(num1, num2):
    return num1 + num2

讓我們用兩個數字作為參數呼叫 add() 函數:

>>> add(4, 3)
7
>>> add(12, 5)
17
>>> add(12, 6)
18

在本例中,num1num2 是兩個參數,返回值為 num1 + num2

>>> (lambda num1, num2: num1 + num2)(3, 7)
10

Python 函數也可以設定參數的預設值。讓我們修改 add() 函數的定義,將 num2 參數的預設值設為 10。

def add(num1, num2=10):
    return num1 + num2

在以下函數呼叫中:

  • 在第一個函數呼叫中,num1 的值為 1,num2 的值為 3。當您在函數呼叫中傳入 num2 的值時,將使用該值;函數返回 4。
  • 但是,如果只傳入一個參數 (num1 為 7),則 num2 使用預設值 10;函數返回 17。
>>> add(1, 3)
4
>>> add(7)
17

在編寫將某些參數的預設值作為 lambda 表達式的函數時,您可以在定義參數時指定預設值。

>>> (lambda num1, num2 = 10: num1 + num2)(1)
11

何時應在 Python 中使用 Lambda 函數?

現在您已了解 Python 中 lambda 函數的基本知識,以下是一些應用場景:

  • 當您有一個函數的返回表達式是一行程式碼,且您不需要在同一個模組的其他地方參照該函數時,可以使用 lambda 函數。我們還編寫了一些範例來說明這一點。
  • 您可以在使用內建函數時使用 lambda 函數,例如 map()filter()reduce()
  • Lambda 函數有助於對 Python 資料結構(例如列表和字典)進行排序。

如何將 Python Lambda 與內建函數一起使用

1. 使用 Lambda 和 map()

map() 函數接受一個可迭代物件和一個函數,並將該函數應用於可迭代物件中的每個項目,如下所示:

讓我們建立一個 nums 列表,並使用 map() 函數建立一個新列表,其中包含 nums 列表中每個數字的平方。 請注意,我們使用 lambda 函數來定義平方運算。

>>> nums = [4, 5, 6, 9]
>>> list(map(lambda num: num * num, nums))
[16, 25, 36, 81]

由於 map() 函數會返回一個地圖物件,我們應該將它轉換成一個列表。

▶️ 在 Python 中查看有關 map() 函數的本教學。

2. 使用 Lambda 和 filter()

讓我們定義 nums,一個數字列表:

>>> nums = [4, 5, 6, 9]

假設您想要篩選此列表,並僅保留奇數。

您可以使用 Python 的內建 filter() 函數。

filter() 函數接受一個條件和一個可迭代物件:filter(condition, iterable)。結果僅包含原始迭代中符合條件的元素。您可以將返回的物件轉換為 Python 可迭代物件,例如列表。

為了篩選掉所有的偶數,我們只保留奇數。所以 lambda 表達式應該是 lambda num: num % 2 != 0。數量 num % 2num 除以 2 的餘數。

  • num 為奇數時,num % 2 != 0True,並且
  • 只要 num 是偶數,num % 2 != 0 就是 False
>>> nums = [4, 5, 6, 9]
>>> list(filter(lambda num: num % 2 != 0, nums))
[5, 9]

3. 使用 Lambda 和 reduce()

reduce() 函數接受一個可迭代物件和一個函數。它透過將函數迭代地應用於可迭代物件的項目來縮減可迭代物件。

要使用 reduce() 函數,您必須從 Python 的內建 functools 模組中導入它:

>>> from functools import reduce

讓我們使用 reduce() 函數來計算 nums 列表中所有數字的總和。我們定義一個 lambda 表達式:lambda num1, num2: num1 + num2,作為縮減和函數。

縮減運算將會像這樣發生:f(f(f(4, 5), 6), 9) = f(f(9, 6), 9) = f(15, 9) = 24。這裡,f 是對列表中兩項的求和運算,由 lambda 函數定義。

>>> from functools import reduce
>>> nums = [4, 5, 6, 9]
>>> reduce(lambda num1, num2: num1 + num2, nums)
24

用於自訂排序的 Python Lambda 函數

除了使用帶有內建 Python 函數的 lambda 函數(例如 map()filter()reduce()),您也可以使用它們來自訂用於排序的內建函數和方法。

1. 對 Python 列表進行排序

使用 Python 列表時,您通常必須根據某些排序標準對它們進行排序。要對 Python 列表進行適當的排序,您可以對它們使用內建的 sort() 方法。如果您需要列表的排序副本,可以使用 sorted() 函數。

使用 Python 的 sorted() 函數的語法是 sorted(iterable, key=..., reverse=True | False)

key 參數用於自訂排序。
reverse 參數可以設定為 TrueFalse;預設值為假。

對數字和字串列表進行排序時,預設排序分別為升序和字母順序。但是,您有時可能想要定義一些自訂的排序標準。

考慮以下列出的水果。假設您想要取得列表的排序副本。您應該根據字串中「p」的出現次數對字串進行排序—按降序排列。

>>> fruits = ['apple', 'pineapple', 'grapes', 'mango']

是時候使用可選的 key 參數了。字串在 Python 中是可迭代的,要取得其中字元出現的次數,可以使用內建的 .count() 方法。因此,我們將 key 設定為 lambda x: x.count('p'),以便根據字串中 'p' 出現的次數進行排序。

>>> fruits = ['apple', 'pineapple', 'grapes', 'mango']
>>> sorted(fruits, key=lambda x: x.count('p'), reverse=True)
['pineapple', 'apple', 'grapes', 'mango']

在這個例子中:

  • 排序的關鍵是字元「p」的出現次數,它被定義為 lambda 表達式。
  • 當我們將 reverse 參數設定為 True 時,排序按「p」出現次數的遞減順序進行。

在水果列表中,'pineapple' 包含 3 次出現的 'p',字串 'apple''grapes''mango' 分別包含 2、1 和 0 次出現的 'p'

了解穩定排序

考慮另一個例子。對於相同的排序標準,我們重新定義了水果列表。這裡,'p' 分別出現在字串 'apple''grapes' 中兩次和一次。它永遠不會出現在字串 'mango''melon' 中。

>>> fruits = ['mango', 'apple', 'melon', 'grapes']
>>> sorted(fruits, key=lambda x: x.count('p'), reverse=True)
['apple', 'grapes', 'mango', 'melon']

在輸出列表中,'mango' 出現在 'melon' 之前,即使它們都沒有字元 'p'。但為什麼會這樣呢? sorted() 函數執行穩定排序;因此,當兩個字串的「p」計數相等時,原始水果列表中的元素順序將被保留。

作為一個快速練習,交換水果列表中「芒果」和「甜瓜」的位置,根據相同的標準對列表進行排序,然後觀察輸出。

▶️ 了解更多關於排序 Python 列表的資訊。

2. 對 Python 字典進行排序

您也可以在對 Python 字典進行排序時使用 lambda。考慮以下包含項目及其價格的字典 price_dict

>>> price_dict = {
... 'Milk': 10,
... 'Honey': 15,
... 'Bread': 7,
... 'Candy': 3
... }

要將字典的鍵值對作為元組列表取得,可以使用內建的字典方法 .items()

>>> price_dict_items = price_dict.items()
dict_items([('Milk', 10), ('Honey', 15), ('Bread', 7), ('Candy', 3)])

在 Python 中,所有可迭代物件:列表、元組、字串等都遵循零索引。所以第一項在索引 0 處,第二項在索引 1 處,依此類推。

我們想按值排序,即字典中每個項目的價格。在 price_dict_items 列表中的每個元組中,索引 1 處的項目是價格。所以我們將 key 設定為 lambda x: x[1],因為它將使用索引 1 處的項目(價格)對字典進行排序。

>>> dict(sorted(price_dict_items, key=lambda x: x[1]))
{'Candy': 3, 'Bread': 7, 'Milk': 10, 'Honey': 15}

在輸出中,字典項目已按價格升序排序:從「Candy」開始,價格為 3 個單位,到「Honey」,價格為 15 個單位。

▶️ 要了解更多資訊,請查看有關按鍵和值對 Python 字典進行排序的詳細指南。

總結

您已經學會如何定義 lambda 函數,並將它們與其他 Python 內建函數有效地結合使用。以下是關鍵要點的摘要:

  • 在 Python 中,lambda 是匿名函數,可以接受多個參數並返回一個值;要評估以產生此返回值的表達式應該是一行程式碼。它們可用於使小型函數定義更簡潔。
  • 要定義 Lambda 函數,您可以使用以下語法:lambda parameter(s): return value
  • 一些重要的應用場景包括將它們與 map()filter()reduce() 函數一起使用,並作為自訂 Python 迭代排序的關鍵參數。

接下來,學習如何在 Python 中執行地板除法。