匿名函數(shù)lambda 除了def語句,,python還提供了一種生成函數(shù)對象的表達式形式。由于它與LISP語言中的一個工具類似,,所以稱為lambda,。 就像def一樣,這個表達式創(chuàng)建了一個之后能夠調(diào)用的函數(shù),,但是它返回一個函數(shù)而不是將這個函數(shù)賦值給一個變量,。這些就是lambda叫做匿名函數(shù)的原因。實際上,,他常常以一種行內(nèi)進行函數(shù)定義的方式使用,,或者用作推遲執(zhí)行一些代碼。 lambda的一般形式是關鍵字lambda之后跟著一個或多個參數(shù)(與一個def頭部內(nèi)用括號括起來的參數(shù)列表類似),,緊跟著是一個冒號,,之后是表達式 lambda arg1,arg2,argn:expression using arguments 由lambda表達式所返回的函數(shù)對象與由def創(chuàng)建并復制后的函數(shù)對象工作起來是完全一致的,,但lambda有一些不同之處,,讓其扮演特定的角色時更有用: lambda是一個表達式,而不是一個語句 因為這一點,,lambda可以出現(xiàn)在python語法不允許def出現(xiàn)的地方,。 lambda的主題是單個表達式,而不是一個代碼塊 這個lambda的主題簡單的就好像放在def主體return語句中的代碼一樣,。 def與lambda的相同用法 x = lambda x, y, z: x + y + z x(2, 3, 4)>>> 9y = (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í)行操作,比如: l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4]for f in l: print(f(2))>>> 4>>> 8>>> 16print(l[0](3))>>> 9 當需要把小段的可執(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ù)結構來構建更多種類的行為表,從而做同樣的事情,。 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,,當你接觸了這三個函數(shù),,那么你才能感受到lambda真實的方便之處 map 函數(shù) 程序?qū)α斜砘蛘咂渌蛄谐3R龅囊患戮褪菍γ總€元素進行一個操作,并把其結果集合起來,。 舉個栗子,我們有一個列表,,需要將列表的每一個字段+10,,我們該如何操作? list_show = [1, 2, 3, 4]# 方式1new_list_show = []for i in list_show: new_list_show.append(i + 10) print(new_list_show)# 方式2def adds(x): return x + 10print(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)用來使它生成所有的結果用于顯示,,python2不必如此。 當然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ù)的過濾操作python基礎教程,,它也是lambda的一個好基友,舉個栗子,。 print(list(filter(lambda x: x % 2 == 0, range(10))))>>> [0, 2, 4, 6, 8] 沒錯,,filter就是這么的簡單實用…. reduce的妙用 reduce在python2中是一個簡單的函數(shù),但在python3中它責備收錄與functools中,。 list_show = [1, 2, 3, 4] print(reduce(lambda x, y: x + y, list_show))>>> 10print(reduce(lambda x, y: x * y, list_show))>>> 24 lambda的實用與它的好基友就介紹到這里,希望對大家有所幫助,。 |
|