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 表達式賦值給一個變數名稱,例如 square1
: square1 = lambda num: num*num
。之後,您可以以任何數字作為參數呼叫 square1
函數。然而,lambda 函數本質上是匿名函數,因此不應將其賦值給變數。
對於 square()
函數,參數為 num
,返回值為 num*num
。掌握這些後,我們可以將其代入 lambda 表達式,並使用參數呼叫它,如下所示:
>>> (lambda num: num*num)(2) 4
這就是立即呼叫函數表達式的概念,我們在定義函數後立即呼叫它。
範例 2. 接下來,我們改寫另一個簡單函數 add()
,它接受數字 num1
和 num2
,並返回它們的和 num1 + num2
。
def add(num1, num2): return num1 + num2
讓我們用兩個數字作為參數呼叫 add()
函數:
>>> add(4, 3) 7 >>> add(12, 5) 17 >>> add(12, 6) 18
在本例中,num1
和 num2
是兩個參數,返回值為 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 % 2
是 num
除以 2 的餘數。
- 當
num
為奇數時,num % 2 != 0
為True
,並且 - 只要
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
參數可以設定為 True
或 False
;預設值為假。
對數字和字串列表進行排序時,預設排序分別為升序和字母順序。但是,您有時可能想要定義一些自訂的排序標準。
考慮以下列出的水果。假設您想要取得列表的排序副本。您應該根據字串中「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 中執行地板除法。