帶有實際示例的 Python lambda 函數

已發表: 2021-06-21

Python lambda 函數是那些很小且沒有名稱定義的函數。 在python中,關鍵字'def'用於定義一個函數。 但是,在匿名函數的情況下,關鍵字“lambda”用於定義這些函數。 因此,命名為“lambda 函數。 可能有名稱或未分配給功能。

與 python 中的常規函數相比,lambda 函數很短。

lambda 函數已添加到 Python、Java、C++、C# 等編程語言的語法中。 雖然它被用作 ML 或 LISP 語言中的核心概念。

本文將重點介紹python lambda函數的概念及其使用。

根據編程語言的類型,lambda 函數可以與以下術語互換使用:

  • 匿名函數
  • Lambda 函數
  • Lambda 表達式
  • Lambda 抽象
  • 拉姆達形式
  • 函數字面量

目錄

Lambda 演算

Lambda 計算是基於 Lambda 表達式構建的計算模型。 Lambda 演算基於純抽象,由 Alonzo Church 形式化。 也稱為 lambda 抽象,它指的是由 Alonzo Church 創建的原始模型。

任何計算都可以用這個概念編碼。

lambda函數的語法:

在 python 中使用 lambda 函數時使用以下語法。

lambda 參數:表達式

python的 lambda 函數中可以有任意數量的參數 但是函數只能有一個表達式。 這個表達式首先被求值,然後被返回。 在需要函數對象的任何地方都可以使用 lambda 函數。

考慮使用 lambda 定義具有兩個參數的匿名函數但未綁定到任何變量的情況:

λx, y: x + y

在這裡,兩個參數由函數獲取並返回總和。

lambda 函數顯示了一些特徵:

  • lambda 函數的主體中不能有任何語句,但只能包含表達式。
  • 執行代碼只有一行。
  • python 中的 lambda 函數不支持類型註釋
  • 允許立即調用。

不能使用語句

如前所述,在定義 lambda 函數時不能有任何語句。 如果用戶使用 pass、return、raise 或 assert 等語句,則會出現 SyntaxError 異常。 異常的結果可以通過以下代碼顯示

資源

在上面的代碼中,當解析包含函數 lambda 主體中assert語句的代碼時,會導致語法錯誤。

lambda 函數只包含一個表達式

與 python 中的所有標準普通函數相比,python 中的 lambda 函數只能包含一個表達式。 函數 lambda 的主體可以通過使用帶括號的多行來使表達式遍布各處。 但是,它仍然是一個單一的表達式。

資源

當存在“奇數”參數時返回字符串“奇數”,而當存在“偶數”參數時返回字符串“偶數”。 上述代碼中使用了兩行,因為它們在括號內。 但它仍然是一個單一的表達式。

類型註釋

隨著 python 中“類型提示”的可用性,普通函數現在比 python 中的 lambda 函數更受歡迎。 隨著 mypy、pyre 等工具的可用性,可以使用full_name() 捕獲類型錯誤。 在運行時引發與 lambda 函數相關的語法錯誤。

立即調用函數執行 (IIFE)

該功能不能在 python 解釋器之外使用。 python 中 lambda 表達式的定義可以傳遞給 map() 等高階函數。

lambda 函數中的參數

python lambda表達式支持不同的方式來傳遞參數,例如:

  • 位置參數
  • 命名參數也稱為關鍵字參數
  • 參數的變量列表,也稱為 varargs。
  • 關鍵字參數的變量列表
  • 只有關鍵字的參數。

Python Lambda 表達式中的裝飾器

裝飾器可以定義為允許將行為添加到類或函數的模式實現。 @decorator的語法用作在 python 中表達裝飾器的函數的前綴

只有使用參數 'Python', decorated_function()才會被打印。 打印的附加行為是'調用函數'decorated_function'。

Python 允許向 lambda 函數添加裝飾器,儘管不需要使用語法@decorator 裝飾器充當調用 lambda 函數的函數。

<lambda> 出現在標識 lambda 函數的位置。 而在普通函數的情況下,即add_two,它被清楚地識別出來。

出於調試的目的,可以用這種方式裝飾 lambda 函數。

關閉

python 中的 Closure() 被定義為一個函數,其中除了函數中使用的參數之外的自由變量綁定到函數範圍內定義的特定值。 我們可以從任何地方調用閉包。 python 中的 Lambda 函數可以充當閉包,就像普通函數充當閉包一樣。

使用 lambda 函數

  • 每當我們需要在更短的時間內使用函數時,都會在這種情況下使用 lambda 函數。
  • 對於將函數傳遞給高階函數的函數,應用了 lambda 函數。 這些函數作為參數傳遞給那些高階函數。
  • python 中的 lambda 函數可以與 map() 等其他內置函數一起使用。

測試 lambda 函數

通過使用 doctest 和 unittest 模塊,可以測試 python 中的 lambda 函數:

  • 單元測試模塊像常規函數一樣測試 lambda 函數。
  • 在 doctest 模塊的情況下,python 代碼是從docstring中提取的,用於執行測試。 lambda 函數的語法不允許docstring 但是,可以將字符串分配給正在命名的 lambda 的 _doc_ 元素。

Python Lambda 函數示例

在下面的代碼中,在返回參數的地方定義了一個名為“identity”的函數。 它通過使用關鍵字“def”定義為python的標準函數。

>>> def 身份 (x);

..... 返回 x

在這裡,x 被函數“identity”作為參數,並在被調用時返回參數。

使用 lambda 編寫相同的代碼將是:

λx:x

該表達式由三部分組成:作為關鍵字的 Lambda,作為綁定變量的 x,以及作為代碼主體的 X。

  • 綁定變量是指傳遞給 lambda 函數的參數。 但是,自由變量是那些未綁定並且可以在表達式主體中引用的變量。 常量可以是自由變量或在函數範圍內定義的變量。

上式可以詳細表述為

>>> λx: x + 1

在這裡,函數將參數加 1。 可以將函數添加到參數中,同時通過使用括號將函數和參數括起來。

>>>(λ x: x + 1)(2)

3

為了計算表達式中的值,應用了縮減策略。 就像在上面的例子中,綁定變量“x”可以用參數 2 代替。

(λ x: x + 1)(2) = λ 2: 2 + 1

= 2 + 1

= 3

lambda函數是一個表達式,可以命名,上面的代碼可以重寫為

>>> add_one = Lambda x : x + 1

>>> add_one(2)

3

這相當於寫:

def add_one(x):

返回 x + 1

lambda 函數採用單個參數。 此外,在 python 中定義 lambda 函數時,函數周圍沒有括號。

為了將多個參數傳遞給python lambda函數,參數被列出並通過使用逗號 (,) 分隔。 列出參數時不應有括號。 多參數函數的示例如下所示:

這裡,full_name 下的 lambda 函數採用兩個參數。 插入第一個最後一個參數的函數返回一個字符串代碼顯示,在定義 lambda 函數時,沒有使用任何括號。 調用 lambda 函數的方式與 python 中的標準函數相同,即使用括號括住參數。

帶有 filter() 的 Python lambda 函數

在 python 中,函數filter()接受一個參數作為一個列表和一個函數。 通過列表中的項目,可以調用返回新項目列表的函數。 這個新創建的列表的函數被評估為True

filter()函數的示例如下所示,用於過濾列表中包含的偶數。

資源

程序生成的輸出是新列表:[4, 6, 8, 12]。

帶有 map() 的 Python lambda 函數

在 python map() 函數中,一個列表和一個函數被作為參數。 列表中包含的所有項目都調用該函數,該函數返回一個新創建的列表,其中包含該函數返回的項目。

結論

Python lambda 函數是那些單行且沒有名稱聲明的函數,即匿名函數。 可以將多個參數傳遞給只能有一個表達式的 lambda 函數。 有時,lambda 函數可以作為參數傳遞給其他函數。 在 python 中使用關鍵字 'def' 定義的函數可以作為常規函數。

因此,本文解釋了 Python 中 lambda 函數的概念、它們與其他函數的應用以及一些示例。 如果您對獲得編程語言專業知識和掌握編碼技能進一步感興趣,可以查看upGrad提供的“數據科學執行 PG 計劃”課程。 它專為 21 至 45 歲的所有希望在數據科學領域獲得編碼技能的入門級專業人士而設計。 如果您願意朝著夢想邁出一步,請挺身而出,看看課程的好處。 通過實踐行業項目,IIIT-B 提供的課程旨在滿足您的需求,讓您為即將到來的頂級行業做好準備。

普通函數和 lambda 函數有什麼區別?

我們知道 Python 中的函數是使用 def 關鍵字定義的。 類似地,lambda 函數是使用 lambda 關鍵字定義的。 考慮以下示例以深入了解兩者之間的區別:
# 正常函數 def sq(x): return x*x # Lambda 函數 lambda_sq = lambda x: x*x # 調用正常 # 定義函數 print(sq(10)) # 使用 lambda 函數 print(lambda_sq(10)) }
上面的示例說明了計算數字平方的 2 個函數。 如果沒有 lambda,我們必須創建一個函數 sq(x),然後返回平方。 另一方面,使用 lambda,整個函數已經簡化為一行。 Lambda 不需要 return 語句。