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