深入理解Lambda

2022-07-15 05:33:09 字數 1691 閱讀 1397

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

變數作用域說明

lambda評價

ref

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中的作用域從上面的幾幅圖中也可以看出一二來,主要可以做出以下幾點的總結:

對區域性變數可見

對全域性變數可見

對當前層傳入的引數可見

對上層函式傳入的引數可見

對上層lambda傳入的引數可見

在普通**裡幾行的**,在lambda中只需要一行就可以解決。所以**比以前更簡潔了

可以在某乙個方法內部定義,這樣可以提高操作的便捷性

lambda是乙個匿名函式,因為是匿名,所以可讀性變差了

有時候有多個lambda巢狀(就像例項中的第3點一樣),讓程式變得難以理解

深入理解lambda

lambda 表示式 lambda expression 是乙個匿名函式,lambda表示式基於數學中的 演算得名,直接對應於其中的lambda抽象 lambda abstraction 是乙個匿名函式,即沒有函式名的函式。語法lambda 函式的語法只包含乙個語句,如下 lambda arg1 a...

深入理解Lambda函式及其用法

1.函式式程式設計 例如 乙個整數列表,要求按照列表中元素的絕對值大小公升序排列 list1 3,5,4,1,0,2,6 sorted list1,key lambda x abs x 0,1,2,3,4,5,6 排序函式sorted支援接收乙個函式作為引數,該引數作為 sorted的排序依據,這裡...

深入理解Lambda函式及其用法

lambda函式又稱匿名函式,匿名函式就是沒有名字的函式,函式沒有名字也行?當然可以啦。有些函式如果只是臨時一用,而且它的業務邏輯也很簡單時,就沒必要非給它取個名字不可。先來看個簡單lambda函式 lambda x,y x y lambda at 0x102bc1c80 x和y是函式的兩個引數,冒...