1. 程式人生 > >深入理解Lambda

深入理解Lambda

概述

  Lambda是一個表示式,也可以說它是一個匿名函式。然而在使用它或是閱讀Lambda程式碼的時候,卻顯得並不那麼容易。因為它匿名,因為它刪減了一些必要的說明資訊(比如方法名)。下面就來說說Lambda是如何進行轉換和工作的吧。

版權說明

目錄

Lambda

初步認識

表示式及定義

lambda [ arg1 [arg2, arg3, … argN] ] : expression
                      – 《Python核心程式設計》

從《Python核心程式設計》書本中包含了以上lambda表示式的表述。也就是說在lambda右側的式子中,冒號左邊的為引數值,右邊的為計算表示式。

例項說明

1.單層引數求和
現在假設需要對兩個數進行求和運算。對於正常的邏輯程式碼,不難寫出如下程式碼:

def sum(x, y):
    return x + y

而在lambda中,我們可以這樣來寫:

p = lambda x, y: x + y

程式碼簡潔了許多,可是因為缺少方法名對此步操作進行描述,也讓我們對這個求和的Lambda表示式有一些疑問,也就是它在程式中目的是什麼,我們難以揣測。
這裡寫圖片描述

2.巢狀引數求和
需求還是之前的需求,可是我們在對引數的傳遞發生了變化。什麼叫作巢狀引數,我們可以參考如下程式碼:
注:下面的一段程式碼實際上是存在語法錯誤的,此程式碼的目的純粹只是為了說明問題。請勿模仿

def sum_outer(x=0):
    def sum_inner(y):
        return x + y

採用lambda改寫後的程式碼如下:

def test_lamdba2(x=0):
    return lambda y: x + y

而兩種程式碼邏輯的轉換關係如下:
這裡寫圖片描述

3.巢狀lambda
前面假想了一種方法內部巢狀方法的情況。我們說Lambda就是理解成在方法內部嵌套了一個“表示式方法”。所以,還可以能上面進行一層Lambda的方法進行改寫。將程式碼中的方法test_lambda2改寫成lambda。改寫後的描述如下圖所示:
這裡寫圖片描述
將上圖所示的轉換過程與之前的轉換進行一個分析,可以得到一個結論,在lambda的表示式中,前面的lambda為外層方法,後續lambda則為次外層方法,並以次由外向內遞推。

變數作用域說明

關於變數在Lambda中的作用域從上面的幾幅圖中也可以看出一二來,主要可以做出以下幾點的總結:

  1. 對區域性變數可見
  2. 對全域性變數可見
  3. 對當前層傳入的引數可見
  4. 對上層函式傳入的引數可見
  5. 對上層Lambda傳入的引數可見

Lambda評價

優點

  1. 在普通程式碼裡幾行的程式碼,在Lambda中只需要一行就可以解決。所以程式碼比以前更簡潔了
  2. 可以在某一個方法內部定義,這樣可以提高操作的便捷性

缺點

  1. Lambda是一個匿名函式,因為是匿名,所以可讀性變差了
  2. 有時候有多個Lambda巢狀(就像例項中的第3點一樣),讓程式變得難以理解

Ref

  • 《Python核心程式設計》
  • 《Python學習手冊》