如何在 Python 中使用 Lambda 函數【附示例】

已發表: 2022-11-10

在本教程中,您將了解有關 Python 中 lambda 函數的所有信息——從定義 lambda 函數的語法到帶有代碼示例的不同用例。

在 Python 中,lambda 是具有簡潔語法的匿名函數,可以與其他有用的內置函數一起使用。 在本教程結束時,您將了解如何定義 lambda 函數以及何時應該考慮在常規 Python 函數上使用它們。

讓我們開始!

Python Lambda 函數:語法和示例

這是在 Python 中定義 lambda 函數的一般語法:

 lambda parameter(s):return value

在上述通用語法中:

  • lambda是定義 lambda 函數時應使用的關鍵字,後跟一個或多個函數應採用的參數
  • 有一個冒號分隔參數和返回值

定義 lambda 函數時,應確保通過計算跨越單行代碼的表達式來計算返回值。 當我們編寫示例代碼時,您會更好地理解這一點。

Python Lambda 函數示例

理解 lambda 函數的最好方法是從將常規 Python 函數重寫為 lambda 函數開始。

您可以在 Python REPL 或 Geekflare 的在線 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() ,它接受數字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),則默認值 10 用於num2 ; 函數返回 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()函數接受一個可迭代對象和一個函數,並將該函數應用於可迭代對像中的每個項目,如下所示:

python-lambda-with-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 可迭代對象,例如列表。

python-lambda-with-filter

為了過濾掉所有的偶數,我們只保留奇數。 所以 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()函數接受一個可迭代的和一個函數。 它通過將函數迭代地應用於可迭代的項目來減少可迭代。

python-lambda-with-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 ; 默認值為False

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

考慮以下列表fruits 。 假設您想要獲取列表的排序副本。 您應該根據字符串中“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']

在這個例子中:

  • 排序的key是字符“p”的出現次數,它被定義為 lambda 表達式。
  • 當我們將reverse參數設置為True時,排序按照“p”出現次數的遞減順序進行。

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

了解穩定排序

考慮另一個例子。 對於相同的排序標準,我們重新定義了fruits列表。 這裡,'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”計數相等時,原始fruits列表中的元素順序將被保留。

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

️ 了解更多關於排序 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 中執行地板除法。