1.匿名函數(shù)介紹
在Python中,通過(guò)lambda關(guān)鍵字來(lái)定義的函數(shù)稱為匿名函數(shù);
lambda函數(shù)能接收任何數(shù)量(可以是0個(gè))的參數(shù),但只能返回一個(gè)表達(dá)式的值,lambda函數(shù)是一個(gè)函數(shù)對(duì)象,直接賦值給一個(gè)變量,這個(gè)變量就成了一個(gè)函數(shù)對(duì)象
語(yǔ)法:lambda 參數(shù) : 表達(dá)式
先寫lambda關(guān)鍵字,然后依次寫匿名函數(shù)的參數(shù),多個(gè)參數(shù)中間用英文逗號(hào)分隔,然后是一個(gè)英文冒號(hào),冒號(hào)后面寫返回的表達(dá)式;
使用場(chǎng)景:
1.需要將一個(gè)函數(shù)對(duì)象作為參數(shù)來(lái)傳遞時(shí),可以直接定義一個(gè)lambda函數(shù)(作為函數(shù)的參數(shù)或返回值一);
2.要處理的業(yè)務(wù)符合lambda函數(shù)的情況(任意多個(gè)參數(shù)和一個(gè)返回值),并且只有一個(gè)地方會(huì)使用這個(gè)函數(shù),不會(huì)在其他地方重用,可以使用lambad函數(shù);
3.與一些python的內(nèi)置函數(shù)配合合適,提高代碼的可讀性;
2.匿名函數(shù)與普通函數(shù)的對(duì)比
def sum_func(a, b, c):
return a + b + c
sum_lambda = lambda a, b, c: a + b + c
print(sum_func(1, 100, 10000))
print(sum_lambda(1, 100, 10000))
運(yùn)行結(jié)果:
10101
10101
可以看到,lambda適用于多個(gè)參數(shù)、一個(gè)返回值的情況,可以用一個(gè)變量來(lái)接收,變量是一個(gè)函數(shù)對(duì)象,執(zhí)行這個(gè)函數(shù)對(duì)象的結(jié)果與執(zhí)行一個(gè)普通函數(shù)的結(jié)果一樣。
lambda函數(shù)比普通函數(shù)更簡(jiǎn)潔,且沒(méi)有聲明函數(shù)名,上面的代碼是用一個(gè)變量來(lái)接收l(shuí)ambda函數(shù)返回的函數(shù)對(duì)象,并不是lambda函數(shù)的名字。
3.匿名函數(shù)的多種形式
#無(wú)參數(shù)
lambda_a = lambda :1001
print(lambda_a())
#一個(gè)參數(shù)
lambda_b = lambda b : b * 10
print(lambda_b(10))
#多個(gè)參數(shù)
lambda_c = lambda a,b,c : a+b+c
print(lambda_c(5,6,7))
#表達(dá)式
lambda_d = lambda x: x if x % 2 ==0 else x+1
print(lambda_d(5))
print(lambda_d(6))
運(yùn)行結(jié)果:
1001
100
18
6
6
lambda的參數(shù)可以是0個(gè)或多個(gè),并且返回的表達(dá)式可以是一個(gè)復(fù)雜的表達(dá)式,只要最后返回的是一個(gè)值就可以了;
4.lambda作為一個(gè)參數(shù)傳遞
def sub_func(a,b,func):
print('a = ',a)
print('b = ',b)
print('a + b = ',func(a,b))
sub_func(12,5,lambda a,b:a+b)
運(yùn)行結(jié)果:
a = 12
b = 5
a + b = 17
5.lambda函數(shù)與python內(nèi)置函數(shù)配合使用
#匿名函數(shù)與max()函數(shù)配合使用
list1 = [{'a':10, 'b':20},{'a':13,'b': 2},{'a':23,'b':13},{'a':32,'b':17}]
m = max(list1,key=lambda x :x['a'])
print('列表最大數(shù):',m)
運(yùn)行結(jié)果:
列表最大數(shù): {'a': 32, 'b': 17}
6.lambda作為函數(shù)的返回值
def ret_func(a,b):
return lambda c : a + b + c
return_func = ret_func(50, 51)
print(return_func)
print(return_func(4))
運(yùn)行結(jié)果:
<function ret_func.<locals>.<lambda> at 0x000001711D2B8400>
105
匿名函數(shù)可以作為一個(gè)函數(shù)的返回值,在如上代碼中,ret_func返回的是一個(gè)匿名函數(shù),返回的是一個(gè)函數(shù)對(duì)象,當(dāng)執(zhí)行這個(gè)函數(shù)時(shí),可以得到lamdba函數(shù)的結(jié)果。
注意:其中a,b兩個(gè)參數(shù)是ret_func中的參數(shù),但執(zhí)行返回的函數(shù)return_func時(shí),已經(jīng)不在ret_func的作用域內(nèi),而lambda函數(shù)仍然能使用a,b,參數(shù),說(shuō)明lambda函數(shù)會(huì)將它的運(yùn)行環(huán)境保存一份,一直保留到它自己執(zhí)行的時(shí)候使用。
7.匿名函數(shù)的優(yōu)點(diǎn)
- 使用Python寫一些腳本時(shí),使用lambda可以省去定義函數(shù)的過(guò)程,讓代碼更精簡(jiǎn);
- 對(duì)于一些抽象的,不會(huì)被別的地方再重復(fù)使用的函數(shù),有時(shí)候函數(shù)起個(gè)名稱也是個(gè)難題,使用lambda不需要考慮命命名問(wèn)題;
- 使用lambda在某些時(shí)候代碼更容易理解