Python編程思想(22):Lambda表達式

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《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,或掃描下面二維碼加微信--------

歡迎關注  極客起源  微信公衆號,更多精彩視頻和文章等着你哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章