一、匿名函數(shù)介紹
在Python中,不通過def來聲明函數(shù)名字,而是通過lambda關(guān)鍵字來定義的函數(shù)稱為匿名函數(shù)。
lambda函數(shù)能接收任何數(shù)量(可以是0個)的參數(shù),但只能返回一個表達(dá)式的值,lambda函數(shù)是一個函數(shù)對象,直接賦值給一個變量,這個變量就成了一個函數(shù)對象。
語法:lambda 參數(shù):表達(dá)式
先寫lambda關(guān)鍵字,然后依次寫匿名函數(shù)的參數(shù),多個參數(shù)中間用逗號連接,然后是一個冒號,冒號后面寫返回的表達(dá)式。
使用lambda函數(shù)可以省去函數(shù)的定義,不需要聲明一個函數(shù)然后使用,而可以在寫函數(shù)的同時直接使用函數(shù)。
使用場景:
1.需要將一個函數(shù)對象作為參數(shù)來傳遞時,可以直接定義一個lambda函數(shù)(作為函數(shù)的參數(shù)或返回值)
2.要處理的業(yè)務(wù)符合lambda函數(shù)的情況(任意多個參數(shù)和一個返回值),并且只有一個地方會使用這個函數(shù),不會在其他地方重用,可以使用lambda函數(shù)
3.與一些Python的內(nèi)置函數(shù)配合使用,提高代碼的可讀性
二、匿名函數(shù)與普通函數(shù)的對比
可以看到,lambda適用于多個參數(shù)、一個返回值的情況,可以用一個變量來接收,變量是一個函數(shù)對象,執(zhí)行這個函數(shù)對象的結(jié)果與執(zhí)行一個普通函數(shù)的結(jié)果一樣。
lambda函數(shù)比普通函數(shù)更簡潔,且沒有聲明函數(shù)名,上面的代碼是用一個變量來接收lambda函數(shù)返回的函數(shù)對象,并不是lambda函數(shù)的名字。
三、匿名函數(shù)的多種形式
可以看到,lambda的參數(shù)可以0個到多個,并且返回的表達(dá)式可以是一個復(fù)雜的表達(dá)式,只要值是一個值就行了。
四、lambda作為一個參數(shù)傳遞
上面的代碼中,sub中需要傳入一個函數(shù),然后這個函數(shù)在sub里面執(zhí)行,這時候我們就可以使用lambda函數(shù),因?yàn)閘ambda就是一個函數(shù)對象。
五、lambda作為函數(shù)的返回值
匿名函數(shù)可以作為一個函數(shù)的返回值,在上面的代碼中,run返回的是一個匿名函數(shù),返回的是一個函數(shù)對象,當(dāng)我們執(zhí)行這個函數(shù)時,可以得到lambda函數(shù)的結(jié)果。
注意:其中的a,b兩個參數(shù)是run中的參數(shù),但我們執(zhí)行返回的函數(shù)run_a時,已經(jīng)不在run的作用域內(nèi)了,而lambda函數(shù)仍然能使用a,b參數(shù)。說明lambda函數(shù)會將它的運(yùn)行環(huán)境保存一份,一直保留到它自己執(zhí)行的時候使用。