python lambda函式的行為可能有點反直覺,例如在一些包含迴圈的情況中。要深入理解這些行為,需要搞清楚python中的變數到底什麼時候繫結的。
下面看看常規函式和lambda的例子。
1>>> def wrap(n):
2... def f():
3... print(n)
4... return f
5...
6>>> numbers = 'one', 'two', 'three'
7>>> funcs =
8>>> for n in numbers:
10...
11>>> for f in funcs:
12... f()
13...
14one
15two
16three
上面**是常規函式,引數n是在第9行的時候求值並繫結的,也就是說這個wrap函式的返回值(f),被加入到funcs中的時候一定就已經確定了。
現在我們用lambda把上面的邏輯再擼一遍,看看它作什麼妖。
1>>> numbers = 'one', 'two', 'three'
2>>> funcs =
3>>> for n in numbers:
5...
6>>> for f in funcs:
7... f()
8...
9three
10three
11three
結果大不同。變數n的值,在lambda真正執行的時候才求值。所以n的值是"three"。在第4行的lambda函式會生成乙個閉包,而n作為乙個自由變數,在執行時才繫結到這個閉包上。
要想解決這個晚繫結的問題,可以用下面的方式將自由變數(free variable)賦值到lambda的引數,這裡的引數n的預設值是變數n,而python中預設引數是早繫結的。
1>>> numbers = 'one', 'two', 'three'
2>>> funcs =
3>>> for n in numbers:
5...
6>>> for f in funcs:
7... f()
8...
9one
10two
11three
每天學一點,進步每一天~~
文中的例子來自 :
關於python中lambda 函式使用小結
例子 如果定義普通函式,一般都是這樣寫 def ds x return 2 x 1 呼叫即 ds 5 如果用lambda函式就是這麼寫,就是一句話 g lambda x 2 x 1 呼叫 g 5 以這樣認為,lambda作為乙個表示式,定義了乙個匿名函式,冒號左邊x為入口引數,右邊x 1為函式體 計...
Python中的Lambda表示式小析
lambda表示式在python中經常使用到,在此總結下lambda表示式的常用方法。首先,要明白lambda表達在python中是作為乙個匿名函式的構造器而存在。其次,要明白lambda表示式的常用場景是lambda表示式對應函式的使用次數非常有限 因此,沒有必要專門定義乙個非匿名函式 同時保證了...
Python中的lambda形式
python中的lambda語句被用來建立新的函式物件,並且在執行時返回它們。注意 1 下面的例子使用make repeater函式在執行時,通過lambda語句來建立新的函式物件,並且返回它。在這裡,lambda需要乙個引數,後面僅跟單個表示式作為函式體,而表示式的值被這個新建的函式返回。2 注意...