2017-09-13 30 views
1

爲了充分理解它們的工作方式以及評估「名稱」的含義,我一直試圖破譯一些lambda示例。將lambda表達式轉換爲函數以更好地理解它

我一直在瀏覽同一性質的多個問題,所有問題都很好解釋,但是我仍然無法理解這些特定lambda的工作方式。正因爲如此,我一直在嘗試編寫單獨的函數,鏡像lam​​bda表達式,我覺得這樣會幫助我更好地理解它們。

對於下面的例子:

funcs = [lambda: i for i in range(3)] 
for f in funcs: print(f()) 

這將打印數量 '2',三次。爲什麼是這樣?我一直在試圖創建一個函數來鏡像發生的確切過程。但是,我一直在嘗試多種方法,仍然無法在列表中列出三次數字「2」。

但是,在下一個示例中,我可以在爲它創建類似函數後更好地理解它。

funcs = [lambda i=i:i for i in range(3)] 
for f in funcs: print(f()) 

這分別打印出1,2,3,這就是我希望它工作的方式。這裏是我的自定義函數:

func = [] 
def i(i): 
    for i in range(i): 
      func = i 

>>> i(3) 
0 
1 
2 

上面的函數糾正的,因爲它反映了一個方法,我們可以詳細的每一個步驟,因爲它是lambda表達式?我盡力了。

正如我上面提到的,我被困在開發一個函數以反映第一個lambda表達式,因此我不完全知道表達式是如何工作的。任何人都可以幫助我分解這個lambda如何工作;我一直堅持一段時間試圖瞭解函數執行時如何評估函數體中的名稱以及爲什麼進行評估。

回答

2

你的第一個例子是相同的:

In [ ]: 
def outer(): 
    return x 

funcs = [] 
for x in range(3): 
    funcs.append(outer) 

for f in funcs: 
    print(f()) 

Out[ ]: 
2 
2 
2 

但這只是等同於:

In [ ]: 
funcs = [outer] * 3 
x = 2 
for f in funcs: 
    print(f()) 

Out[ ]: 
2 
2 
2 

你的第二個例子是等價於:

In [ ]: 
def outer(x): 
    def inner(): 
     return x 
    return inner 

funcs = [] 
for x in range(3): 
    funcs.append(outer(x)) 

for f in funcs: 
    print(f()) 

Out[ ]: 
0 
1 
2 

很像關閉xinner函數lambda i=i: i強制lambda鎖定當前值i,而lambda: i不會,並且它在lambda執行時僅使用i的值。

+0

這個答案很好。不過,我仍然堅持你提供的第一個例子。我一直在嘗試幾個小時以瞭解到底發生了什麼。當我運行一次循環時,'0'被附加到'funcs'。當循環第二次運行時,它會覆蓋已經附加到'funcs'的'0',並用'1'替換它,並附加另一個'1'?當我第三次運行循環(範圍(3))時,'2'將覆蓋列表中的當前值,並向其追加一個'2' ... 這背後的邏輯是什麼?這讓我非常難過。 – juiceb0xk

+0

在第一個例子中,'outer'沒有被執行,所以'0'沒有被追加到'funcs',只是一個返回'x'的函數被添加了,第二次和第三次迭代都是一樣的。當循環'x'爲'2'後執行函數時,每個函數返回'2'。 – AChampion

+0

哇,這是非常有意義的。我以爲我們將我們的迭代器值附加到列表中... 非常感謝您幫助我更深入地理解我的問題。 – juiceb0xk