李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。
《Python編程思想》總目錄
現在幾乎所有的現代編程語言都支持lambda表達式,如果說函數是命名的、方便複用的代碼塊,那麼 lambda表達式則是功能更靈活的代碼塊,它可以在程序中被傳遞和調用。
1. 先來回顧一下局部函數
在前面的文章已經介紹過了局部函數,現在讓我們再回顧一下:
# 定義函數,該函數會返回局部函數的計算結果
def multi_math_func(type) :
# 定義一個計算平方的局部函數
def square(n) :
return n * n
# 定義一個計算立方的局部函數
def cube(n) :
return n * n * n
# 定義一個計算階乘的局部函數
def factorial(n) :
result = 1
for index in range(2, n + 1) :
result *= index
return result
# 調用局部函數
if type == "square" :
return square # 返回square函數
elif type == "cube":
return cube # 返回cube函數
else:
return factorial # 返回factorial函數
# 調用get_math_func(),程序返回一個嵌套函數
math_func = multi_math_func("cube") # 得到cube函數
print(math_func(7)) # 輸出343
math_func = multi_math_func("square") # 得到square函數
print(math_func(3)) # 輸出9
math_func = multi_math_func("other") # 得到factorial函數
print(math_func(6)) # 輸出720
由於局部函數的作用域默認僅停留在其封閉函數之內,因此這3個局部函數的函數名的作用太有限了,僅僅是在程序的if語句中作爲返回值使用。一旦離開了multi_math_func函數體,這3個局部函數的函數名就失去了意義。既然局部函數的函數名沒有太大的意義,那麼就可以考慮使用 lambda表達式來簡化局部函數的寫法
2. 使用lambda表達式代替局部函數
如果使用 lambda表達式來簡化上面的函數,則可以將程序改寫成如下形式。
示例代碼:lambda_test. py
# 定義函數,該函數會返回局部函數的計算結果
def multi_math_func(type) :
# 調用局部函數
if type == "square" :
return lambda n:n * n
elif type == "cube":
return lambda n:n * n * n
else:
return lambda n:n**2
# 調用get_math_func(),程序返回一個嵌套函數
math_func = multi_math_func("cube") # 得到cube函數
print(math_func(7)) # 輸出343
math_func = multi_math_func("square") # 得到square函數
print(math_func(3)) # 輸出9
math_func = multi_math_func("other") # 得到factorial函數
print(math_func(6)) # 輸出36
從這段代碼可以看出,return後面的部分使用 lambda關鍵字定義的就是 lambda表達式,Python要求 lambda表達式只能是單行表達式。
由於 lambda表達式只能是單行表達式,所以不允許使用更復雜的函數形式,因此無法計算斐波那契數列,所以else子句中該成了計算平方的函數。
lambda表達式的語法格式如下:
lambda [parameter1ist]:表達式
從上面的語法格式可以看出 lambda表達式的幾個要點。
-
lambda表達式必須使用 lambda關鍵字定義;
-
在 lambda關鍵字之後、冒號左邊的是參數列表,可以沒有參數,也可以有多個參數。如果有多個參數,則需要用逗號隔開,冒號右邊是該 lambda表達式的返回值;
實際上, lambda表達式的本質就是匿名函數、而且這個匿名函數必須是單行的。因此, lambda表達式可以寫成函數的形式。例如,對於如下lambda表達式。
lambda x, y: x+y
可改寫爲如下函數形式。
def add(x, y): return x+y
上面定義函數時使用了簡化語法,當函數體只有一行代碼時,可以直接把函數體的代碼放在與函數頭同一行。
總體來說,函數比 lambda表達式的適應性更強, lambda表達式只能創建簡單的函數對象。但 lambda表達式依然有如下2個用途:
-
對於單行函數,使用 lambda表達式可以省去定義函數的過程,讓代碼更加簡潔;
-
對於不需要多次複用的函數,使用 lambda表達式可以在用完之後立即釋放,,提高了性能;
下面的代碼演示了通過 lambda表達式來調用 Python內置的map()函數的過程
示例代碼: lambda_map_test.py
# 傳入計算平方的lambda表達式作爲參數
x = map(lambda x: x*x , range(8))
print([e for e in x]) # [0, 1, 4, 9, 16, 25, 36, 49]
# 傳入計算立方的lambda表達式作爲參數
y = map(lambda x: x**3 if x % 2 == 1 else 0, range(8))
print([e for e in y]) # [0, 1, 0, 27, 0, 125, 0, 343]
正如從上面代碼所看到的,內置的map函數的第一個參數需要傳入函數,此處傳入了函數的簡化形式: lambda表達式,這樣程序更加簡潔,而且性能更好。
-----------------支持作者請轉發本文,也可以加李寧老師微信:unitymarvel,或掃描下面二維碼加微信--------
歡迎關注 極客起源 微信公衆號,更多精彩視頻和文章等着你哦!