lambda是Python編程語言中使用頻率較高的一個關鍵字魔种。那么滔金,什么是lambda霉涨?它有哪些用法?
一尘惧、語法
lambda [ arg1 [arg2, arg3, … argN] ] : expression
– 《Python核心編程》
從《Python核心編程》書本中包含了以上lambda表達式的表述康栈。也就是說在lambda右側的式子中,冒號左邊的為參數(shù)值喷橙,右邊的為計算表達式啥么。
二、 實例說明
1.單層參數(shù)求和
現(xiàn)在假設需要對兩個數(shù)進行求和運算贰逾。對于正常的邏輯代碼悬荣,不難寫出如下代碼:
def sum(x, y):
return x + y
而在lambda中,我們可以這樣來寫:
p = lambda x, y: x + y
代碼簡潔了許多
2.嵌套參數(shù)求和
注:下面的一段代碼實際上是存在語法錯誤的疙剑,此代碼的目的純粹只是為了說明問題氯迂。請勿模仿
def sum_outer(x=0):
def sum_inner(y):
return x + y
采用lambda改寫后的代碼如下:
def test_lamdba2(x=0):
return lambda y: x + y
三践叠、特性
lambda函數(shù)有如下特性:
- lambda函數(shù)是匿名的:所謂匿名函數(shù),通俗地說就是沒有名字的函數(shù)嚼蚀。lambda函數(shù)沒有名字禁灼。
- lambda函數(shù)有輸入和輸出:輸入是傳入到參數(shù)列表argument_list的值,輸出是根據(jù)表達式expression計算得到的值轿曙。
- lambda函數(shù)一般功能簡單:單行expression決定了lambda函數(shù)不可能完成復雜的邏輯弄捕,只能完成非常簡單的功能。由于其實現(xiàn)的功能一目了然导帝,甚至不需要專門的名字來說明守谓。
四、用法說明
由于lambda語法是固定的舟扎,其本質上只有一種用法分飞,那就是定義一個lambda函數(shù)。在實際中睹限,根據(jù)這個lambda函數(shù)應用場景的不同譬猫,可以將lambda函數(shù)的用法擴展為以下幾種:
1.將lambda函數(shù)賦值給一個變量,通過這個變量間接調用該lambda函數(shù)羡疗。
例如染服,執(zhí)行語句add=lambda x, y: x+y,定義了加法函數(shù)lambda x, y: x+y叨恨,并將其賦值給變量add柳刮,這樣變量add便成為具有加法功能的函數(shù)。例如痒钝,執(zhí)行add(1,2)秉颗,輸出為3。
2.將lambda函數(shù)賦值給其他函數(shù)送矩,從而將其他函數(shù)用該lambda函數(shù)替換蚕甥。
例如,為了把標準庫time中的函數(shù)sleep的功能屏蔽(Mock)栋荸,我們可以在程序初始化時調用:time.sleep=lambda x:None菇怀。這樣,在后續(xù)代碼中調用time庫的sleep函數(shù)將不會執(zhí)行原有的功能晌块。例如爱沟,執(zhí)行time.sleep(3)時,程序不會休眠3秒鐘匆背,而是什么都不做呼伸。
3.將lambda函數(shù)作為其他函數(shù)的返回值,返回給調用者钝尸。
函數(shù)的返回值也可以是函數(shù)括享。例如return lambda x, y: x+y返回一個加法函數(shù)闽铐。這時,lambda函數(shù)實際上是定義在某個函數(shù)內部的函數(shù)奶浦,稱之為嵌套函數(shù),或者內部函數(shù)踢星。對應的澳叉,將包含嵌套函數(shù)的函數(shù)稱之為外部函數(shù)。內部函數(shù)能夠訪問外部函數(shù)的局部變量沐悦,這個特性是閉包(Closure)編程的基礎成洗,在這里我們不展開。
4.將lambda函數(shù)作為參數(shù)傳遞給其他函數(shù)藏否。
部分Python內置函數(shù)接收函數(shù)作為參數(shù)瓶殃。典型的此類內置函數(shù)有這些。
filter函數(shù)副签。此時lambda函數(shù)用于指定過濾列表元素的條件遥椿。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定將列表[1,2,3]中能夠被3整除的元素過濾出來,其結果是[3]淆储。
sorted函數(shù)冠场。此時lambda函數(shù)用于指定對列表中所有元素進行排序的準則。例如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距離從小到大進行排序本砰,其結果是[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舔株,其結果[2, 3, 4]。
reduce函數(shù)还棱。此時lambda函數(shù)用于指定列表中兩兩相鄰元素的結合條件载慈。例如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]中的元素從左往右兩兩以逗號分隔的字符的形式依次結合起來,其結果是'1, 2, 3, 4, 5, 6, 7, 8, 9'诱贿。
另外娃肿,部分Python庫函數(shù)也接收函數(shù)作為參數(shù),例如gevent的spawn函數(shù)珠十。此時料扰,lambda函數(shù)也能夠作為參數(shù)傳入。
五焙蹭、變量作用域說明
關于變量在Lambda中的作用域從上面的幾幅圖中也可以看出一二來晒杈,主要可以做出以下幾點的總結:
- 對局部變量可見
- 對全局變量可見
- 對當前層傳入的參數(shù)可見
- 對上層函數(shù)傳入的參數(shù)可見
- 對上層Lambda傳入的參數(shù)可見
六、Lambda評價
優(yōu)點
- 在普通代碼里幾行的代碼孔厉,在Lambda中只需要一行就可以解決拯钻。所以代碼比以前更簡潔了
- 可以在某一個方法內部定義帖努,這樣可以提高操作的便捷性
缺點 - Lambda是一個匿名函數(shù),因為是匿名粪般,所以可讀性變差了
- 有時候有多個Lambda嵌套(就像實例中的第3點一樣)拼余,讓程序變得難以理解