您好,登錄后才能下訂單哦!
匿名函數(shù)lambda
除了def語句,python還提供了一種生成函數(shù)對象的表達式形式。由于它與LISP語言中的一個工具類似,所以稱為lambda。
就像def一樣,這個表達式創(chuàng)建了一個之后能夠調(diào)用的函數(shù),但是它返回一個函數(shù)而不是將這個函數(shù)賦值給一個變量。這些就是lambda叫做匿名函數(shù)的原因。實際上,他常常以一種行內(nèi)進行函數(shù)定義的方式使用,或者用作推遲執(zhí)行一些代碼。
lambda的一般形式是關(guān)鍵字lambda之后跟著一個或多個參數(shù)(與一個def頭部內(nèi)用括號括起來的參數(shù)列表類似),緊跟著是一個冒號,之后是表達式
lambda arg1,arg2,argn:expression using arguments
由lambda表達式所返回的函數(shù)對象與由def創(chuàng)建并復(fù)制后的函數(shù)對象工作起來是完全一致的,但lambda有一些不同之處,讓其扮演特定的角色時更有用:
lambda是一個表達式,而不是一個語句
因為這一點,lambda可以出現(xiàn)在python語法不允許def出現(xiàn)的地方。
此外,作為一個表達式,lambda返回一個值(一個新的函數(shù)),可以選擇性的賦值給一個變量
相反,def語句總是得在頭部將一個新的函數(shù)賦值給一個變量,而不是將這個函數(shù)作為結(jié)果返回。
lambda的主題是單個表達式,而不是一個代碼塊
這個lambda的主題簡單的就好像放在def主體return語句中的代碼一樣。
簡單的將結(jié)果寫成一個順暢的表達式,而不是明確的返回。
但由于它僅限于表達式,故lambda通常要比def功能少…你僅能夠在lambda主體中封裝有限的邏輯進去,因為他是一個為編寫簡單函數(shù)而設(shè)計的。
除了上述這些差別,def和lambda都能過做同樣種類的工作
def與lambda的相同用法
x = lambda x, y, z: x + y + z
x(2, 3, 4)
>>> 9
y = (lambda a='hello', b='world': a + b)
y(b='Python')
>>> 'hellopython'
為什么使用lambda
看過上面的兩個小例子,很多人會說這個和def沒什么差別,我們又為什么要使用lambda呢?
通常來說,lambda起到一種函數(shù)的速寫作用,允許在使用的代碼內(nèi)嵌一個函數(shù)的定義,他完全是可選的(是可以使用def代替他們),但是在你僅需要切入一段可執(zhí)行代碼的情況下,它會帶來一個更簡潔的書寫效果。
lambda通常用來編寫跳轉(zhuǎn)表,也就是行為的列表或者字典,能夠按照需求執(zhí)行操作,比如:
'''
遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書!
'''
l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4]
for f in l:
print(f(2))
>>> 4
>>> 8
>>> 16
print(l[0](3))
>>> 9
當(dāng)需要把小段的可執(zhí)行代碼編寫進def語句從語法上不能實現(xiàn)的地方是,lambda表達式作為def的一種速寫來說,是最為有用的,如果上面的代碼用def編寫,則變?yōu)椋?/p>
def f1(x):
return x ** 2
def f2(x):
return x ** 3
def f3(x):
return x ** 4
l = [f1, f2, f3]
for f in l:
print(f(2))
print(l[0](3))
實際上,我們可以用python中的字典或者其他的數(shù)據(jù)結(jié)構(gòu)來構(gòu)建更多種類的行為表,從而做同樣的事情。
lambda中實現(xiàn)if-else
Python中具備的單行表達式:if a:b else c語法在lambda中同樣適用:
lower = lambda x,y:x if x<y else y
lower(4,5)
>>> 4
看了半天,大家可能也并未覺得lambda在python中到底比def優(yōu)越與便利在哪里,那么說到lambda,就必須要提及三個函數(shù)map、filter、reduce,當(dāng)你接觸了這三個函數(shù),那么你才能感受到lambda真實的方便之處
map 函數(shù)
程序?qū)α斜砘蛘咂渌蛄谐3R龅囊患戮褪菍γ總€元素進行一個操作,并把其結(jié)果集合起來。
python提供了一個工具map,它會對一個序列對象中的每一個元素應(yīng)用該的函數(shù),并返回一個包含了所有函數(shù)調(diào)用結(jié)果的列表。
舉個栗子,我們有一個列表,需要將列表的每一個字段+10,我們該如何操作?
'''
遇到問題沒人解答?小編創(chuàng)建了一個Python學(xué)習(xí)交流QQ群:857662006
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學(xué)習(xí)教程和PDF電子書!
'''
list_show = [1, 2, 3, 4]
# 方式1
new_list_show = []
for i in list_show:
new_list_show.append(i + 10)
print(new_list_show)
# 方式2
def adds(x):
return x + 10
print(list(map(adds, list_show)))
# 更優(yōu)雅的方式3:
print(list(map(lambda x: x + 10, list_show)))
看看上面三個實現(xiàn)方式,你覺得那種更加Pythonic?
eg:需要注意一點,map在python3中是一個可迭代對象,引入需要使用列表調(diào)用來使它生成所有的結(jié)果用于顯示,python2不必如此。
當(dāng)然map的闡述函數(shù),不僅僅支持自己編寫的,同樣也支持python自帶的多種函數(shù),比如:
list_show = [1, -2, 3, -4, 5, -6]
print(list(map(abs, list_show)))
>>> [1, 2, 3, 4, 5, 6]
filter函數(shù)
filter通過字面意思,大家就知道它的用處了,用于數(shù)據(jù)的過濾操作,它也是lambda的一個好基友,舉個栗子。
我們需要過濾0-9中,能被2整除的數(shù)字組成一個列表,我們該如何操作?只需要一行代碼:
print(list(filter(lambda x: x % 2 == 0, range(10))))
>>> [0, 2, 4, 6, 8]
沒錯,filter就是這么的簡單實用….
reduce的妙用
reduce在python2中是一個簡單的函數(shù),但在python3中它責(zé)備收錄與functools中。
它接收一個迭代器來處理并返回一個單個的結(jié)果。
list_show = [1, 2, 3, 4]
print(reduce(lambda x, y: x + y, list_show))
>>> 10
print(reduce(lambda x, y: x * y, list_show))
>>> 24
lambda的實用與它的好基友就介紹到這里,希望對大家有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。