Python中的lambda函式一直沒搞太清楚,請問大家都有哪些好的理解?
寫個js回撥就理解了
這個本身就是一個固定的函式,
lambda 函式是匿名函式。顧名思義,就是沒有名字的函式。
Python 中使用關鍵字 def 定義傳統函式,必須賦予函式名字,比如:
# 函式名mydouble
def
mydouble
(
n
):
(
n
*
2
)
mydouble
(
3
)
輸出:6
如果使用匿名函式,則不需要給函式起名字。上述程式碼可表示為:
print((lambda x: x*2)(3))
輸出:6
當一個函式只調用一次時,可使用匿名函式。
f = lambda 引數列表: 表示式
從語法說,上面這行就相當於
def f(引數列表):
return 表示式
沒錯,完全一樣,def出來的f也是變數,可以賦值,可以del
唯一的區別就是lambda本身是一個表示式,而def必須給個名字,所以像傳個函式引數的地方,就省的你弄個臨時名字了
至於在函式內部def或lambda,形成的閉包的原理,這個是閉包的機制
匿名函式就是沒有名字的函式。它用關鍵字lambda來建立,其格式如下:
lambda 形參表:表示式
匿名函式與普通函式的異同
我們知道,def f()定義了一個函式物件,並給它起一個函式名f;但匿名函式只是建立一個函式物件,並沒有給它起名。
如果我們把一個匿名函式與一個名字繫結,則與普通函式的定義相當:
add = lambda x,y,z: x + y + z
def add(x,y,z):
return x + y + z
匿名函式的定義是一個表示式,並且把這個表示式返回了。我們用dis函式反彙編一下就會明白:
>>> dis。dis(lambda x,y,z: x + y + z)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_ADD
7 LOAD_FAST 2 (z)
10 BINARY_ADD
11 RETURN_VALUE
普通函式和匿名函式的引數形式及傳參方式完全一樣。
普通函式和匿名函式都是先定義而後呼叫。但神奇的是,匿名函式可以把定義與呼叫合併為一個步驟,而普通函式則不行。
>>> (lambda x,y,z: x + y + z)(1,2,3)
6
普通函式可以包含各種語句,包括賦值和各種複合語句;而lambda的主體是一個純表示式,它不能有賦值語句,也不能使用if,while等複合語句。
匿名函式的巢狀
匿名函式的作用域查詢與普通函式完全一樣,所以匿名函式既可以內嵌在普通函式中,也可以內嵌在匿名函式中。
比如,在《A Python Interpreter Written in Python》一文中,有這樣一個函式:
def make_cell(value):
“”“Create a real Python closure and grab a cell。”“”
fn = (lambda x: lambda: x)(value)
return fn。__closure__[0]
其中,fn = (lambda x: lambda: x)(value)這一句相當於以下程式碼:
def lambda_1(x):
def lambda_2():
return x
return lambda_2
fn = lambda_1(value)
lambda x: lambda: x這種巢狀函式可以妥妥地建立一個閉包fn。__closure__,函式make_cell返回閉包的一個cell物件:fn。__closure__[0]。
這是多麼騷氣的程式碼!所以,我們有時間還是要多閱讀一些經典的程式。
這樣寫可以理解嗎?希望一起探討!
下一篇:乳腺增生能治好嗎?