关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解
lambda是Python編程語言中使用頻率較高的一個關(guān)鍵字。那么,什么是lambda?它有哪些用法?網(wǎng)上的文章汗牛充棟,可是把這個講透的文章卻不多。這里,我們通過閱讀各方資料,總結(jié)了關(guān)于Python中的lambda的“一個語法,三個特性,四個用法,一個爭論”。歡迎閱讀和溝通(個人微信: fibona007)。
由于文章是從我的公眾號上復(fù)制過來的,因此排版不整齊,但是內(nèi)容絕對充實,歡迎關(guān)注公眾號[測試不將就],閱讀原文
一個語法
在Python中,lambda的語法是唯一的。其形式如下:
?lambda?argument_list: expression
其中,lambda是Python預(yù)留的關(guān)鍵字,argument_list和expression由用戶自定義。具體介紹如下。
1. 這里的argument_list是參數(shù)列表,它的結(jié)構(gòu)與Python中函數(shù)(function)的參數(shù)列表是一樣的。具體來說,argument_list可以有非常多的形式。例如:
- a, b
- a=1, b=2
- ?*args
- ?**kwargs
- ?a, b=1,?*args
- 空
- ......
2. 這里的expression是一個關(guān)于參數(shù)的表達(dá)式。表達(dá)式中出現(xiàn)的參數(shù)需要在argument_list中有定義,并且表達(dá)式只能是單行的。以下都是合法的表達(dá)式:
- 1
- ?None
- a + b
- sum(a)
- 1 if a >10 else 0
- ?......
3.? 這里的lambda argument_list: expression表示的是一個函數(shù)。這個函數(shù)叫做lambda函數(shù)。
?
三個特性
lambda函數(shù)有如下特性:
lambda函數(shù)是匿名的:所謂匿名函數(shù),通俗地說就是沒有名字的函數(shù)。lambda函數(shù)沒有名字。
lambda函數(shù)有輸入和輸出:輸入是傳入到參數(shù)列表argument_list的值,輸出是根據(jù)表達(dá)式expression計算得到的值。
lambda函數(shù)一般功能簡單:單行expression決定了lambda函數(shù)不可能完成復(fù)雜的邏輯,只能完成非常簡單的功能。由于其實現(xiàn)的功能一目了然,甚至不需要專門的名字來說明。
下面是一些lambda函數(shù)示例:
- ? ? ? lambda x, y: x*y;函數(shù)輸入是x和y,輸出是它們的積x*y
- ? ? ?lambda:None;函數(shù)沒有輸入?yún)?shù),輸出是None
- ? ? ?lambda *args: sum(args); 輸入是任意個數(shù)的參數(shù),輸出是它們的和(隱性要求是輸入?yún)?shù)必須能夠進(jìn)行加法運算)
- ? ? ?lambda **kwargs: 1;輸入是任意鍵值對參數(shù),輸出是1
?
四個用法
?
由于lambda語法是固定的,其本質(zhì)上只有一種用法,那就是定義一個lambda函數(shù)。在實際中,根據(jù)這個lambda函數(shù)應(yīng)用場景的不同,可以將lambda函數(shù)的用法擴(kuò)展為以下幾種:
將lambda函數(shù)賦值給一個變量,通過這個變量間接調(diào)用該lambda函數(shù)。
例如,執(zhí)行語句add=lambda x, y: x+y,定義了加法函數(shù)lambda x, y: x+y,并將其賦值給變量add,這樣變量add便成為具有加法功能的函數(shù)。例如,執(zhí)行add(1,2),輸出為3。
將lambda函數(shù)賦值給其他函數(shù),從而將其他函數(shù)用該lambda函數(shù)替換。
例如,為了把標(biāo)準(zhǔn)庫time中的函數(shù)sleep的功能屏蔽(Mock),我們可以在程序初始化時調(diào)用:time.sleep=lambda x:None。這樣,在后續(xù)代碼中調(diào)用time庫的sleep函數(shù)將不會執(zhí)行原有的功能。例如,執(zhí)行time.sleep(3)時,程序不會休眠3秒鐘,而是什么都不做。
? ? ? 3. 將lambda函數(shù)作為其他函數(shù)的返回值,返回給調(diào)用者。
函數(shù)的返回值也可以是函數(shù)。例如return lambda x, y: x+y返回一個加法函數(shù)。這時,lambda函數(shù)實際上是定義在某個函數(shù)內(nèi)部的函數(shù),稱之為嵌套函數(shù),或者內(nèi)部函數(shù)。對應(yīng)的,將包含嵌套函數(shù)的函數(shù)稱之為外部函數(shù)。內(nèi)部函數(shù)能夠訪問外部函數(shù)的局部變量,這個特性是閉包(Closure)編程的基礎(chǔ),在這里我們不展開。
? ? ? 4. 將lambda函數(shù)作為參數(shù)傳遞給其他函數(shù)。
部分Python內(nèi)置函數(shù)接收函數(shù)作為參數(shù)。典型的此類內(nèi)置函數(shù)有這些。
-
filter函數(shù)。此時lambda函數(shù)用于指定過濾列表元素的條件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結(jié)果是[3]。
-
sorted函數(shù)。此時lambda函數(shù)用于指定對列表中所有元素進(jìn)行排序的準(zhǔn)則。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))將列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素與5距離從小到大進(jìn)行排序,其結(jié)果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
-
map函數(shù)。此時lambda函數(shù)用于指定對列表中每一個元素的共同操作。例如map(lambda x: x+1, [1, 2,3])將列表[1, 2, 3]中的元素分別加1,其結(jié)果[2, 3, 4]。
-
reduce函數(shù)。此時lambda函數(shù)用于指定列表中兩兩相鄰元素的結(jié)合條件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])將列表?[1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素從左往右兩兩以逗號分隔的字符的形式依次結(jié)合起來,其結(jié)果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
另外,部分Python庫函數(shù)也接收函數(shù)作為參數(shù),例如gevent的spawn函數(shù)。此時,lambda函數(shù)也能夠作為參數(shù)傳入。
?
一個爭議
事實上,關(guān)于lambda在Python社區(qū)是存在爭議的。Python程序員對于到底要不要使用lambda意見不一致。
-
支持方認(rèn)為使用lambda編寫的代碼更緊湊,更“pythonic”。
-
反對方認(rèn)為,lambda函數(shù)能夠支持的功能十分有限,其不支持多分支程序if...elif...else...和異常處理程序try ...except...。并且,lambda函數(shù)的功能被隱藏,對于編寫代碼之外的人員來說,理解lambda代碼需要耗費一定的理解成本。他們認(rèn)為,使用for循環(huán)等來替代lambda是一種更加直白的編碼風(fēng)格。
關(guān)于lambda的爭執(zhí)沒有定論。在實際中,是否使用lambda編程取決于程序員的個人喜好。
以上就是我們總結(jié)的關(guān)于Python中的lambda的“一個語法,三個特性,四個用法,一個爭論”。如有紕漏之處,歡迎批評指正。
?
作者:軟件工程專家/全棧測試開發(fā)/技術(shù)寫作者,歡迎添加作者微信(fibona007)交流。歡迎微信關(guān)注個人公號"測試不將就"(ID: awesometest),我們一起探討高質(zhì)量軟件養(yǎng)成之道。
總結(jié)
以上是生活随笔為你收集整理的关于Python中的lambda,这篇阅读量10万+的文章可能是你见过的最完整的讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最简单的Lambda入门教程
- 下一篇: QQ空间图片爬虫