1.匿名函數(shù)介紹
在Python中,通過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á)式贱田;
使用場景:
1.需要將一個函數(shù)對象作為參數(shù)來傳遞時,可以直接定義一個lambda函數(shù)(作為函數(shù)的參數(shù)或返回值一)嘴脾;
2.要處理的業(yè)務(wù)符合lambda函數(shù)的情況(任意多個參數(shù)和一個返回值)男摧,并且只有一個地方會使用這個函數(shù),不會在其他地方重用译打,可以使用lambad函數(shù)耗拓;
3.與一些python的內(nèi)置函數(shù)配合合適,提高代碼的可讀性奏司;
2.匿名函數(shù)與普通函數(shù)的對比
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))
運行結(jié)果:
10101
10101
可以看到乔询,lambda適用于多個參數(shù)、一個返回值的情況韵洋,可以用一個變量來接收竿刁,變量是一個函數(shù)對象黄锤,執(zhí)行這個函數(shù)對象的結(jié)果與執(zhí)行一個普通函數(shù)的結(jié)果一樣。
lambda函數(shù)比普通函數(shù)更簡潔食拜,且沒有聲明函數(shù)名鸵熟,上面的代碼是用一個變量來接收lambda函數(shù)返回的函數(shù)對象,并不是lambda函數(shù)的名字负甸。
3.匿名函數(shù)的多種形式
#無參數(shù)
lambda_a = lambda :1001
print(lambda_a())
#一個參數(shù)
lambda_b = lambda b : b * 10
print(lambda_b(10))
#多個參數(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))
運行結(jié)果:
1001
100
18
6
6
lambda的參數(shù)可以是0個或多個流强,并且返回的表達(dá)式可以是一個復(fù)雜的表達(dá)式,只要最后返回的是一個值就可以了呻待;
4.lambda作為一個參數(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)
運行結(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)
運行結(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))
運行結(jié)果:
<function ret_func.<locals>.<lambda> at 0x000001711D2B8400>
105
匿名函數(shù)可以作為一個函數(shù)的返回值煮盼,在如上代碼中,ret_func返回的是一個匿名函數(shù)带污,返回的是一個函數(shù)對象,當(dāng)執(zhí)行這個函數(shù)時香到,可以得到lamdba函數(shù)的結(jié)果鱼冀。
注意:其中a,b兩個參數(shù)是ret_func中的參數(shù),但執(zhí)行返回的函數(shù)return_func時悠就,已經(jīng)不在ret_func的作用域內(nèi)千绪,而lambda函數(shù)仍然能使用a,b,參數(shù),說明lambda函數(shù)會將它的運行環(huán)境保存一份梗脾,一直保留到它自己執(zhí)行的時候使用荸型。
7.匿名函數(shù)的優(yōu)點
- 使用Python寫一些腳本時,使用lambda可以省去定義函數(shù)的過程炸茧,讓代碼更精簡瑞妇;
- 對于一些抽象的,不會被別的地方再重復(fù)使用的函數(shù)梭冠,有時候函數(shù)起個名稱也是個難題辕狰,使用lambda不需要考慮命命名問題;
- 使用lambda在某些時候代碼更容易理解