Python學習13.07:Python lambda表達式(匿名函數)及用法

lambda 表達式(又稱匿名函數)是現代編程語言爭相引入的一種語法,若是說函數是命名的、方便複用的代碼塊,那麼 lambda 表達式則是功能更靈活的代碼塊,它能夠在程序中被傳遞和調用。html

回顧局部函數

回顧《Python函數高級用法》一節中,get_math_func() 函數將返回三個局部函數之一。該函數代碼以下:python

def get_math_func(type) :
    # 定義三個局部函數
    ...
    # 返回局部函數
    if type == "square" :
        return square
    if type == "cube" :
        return cube
    else:
        return factorial

因爲局部函數的做用域默認僅停留在其封閉函數以內,所以這三個局部函數的函數名的做用太有限了,即僅僅是在程序的 if 語句中做爲返回值使用。一旦離開了 get_math_func() 函數體,這三個局部函數的函數名就失去了意義。

既然局部函數的函數名沒有太大的意義,那麼就考慮使用 lambda 表達式來簡化局部函數的寫法。編程

使用 lambda 表達式代替局部函數

def get_math_func(type) :
    result=1
    # 該函數返回的是Lambda表達式
    if type == 'square':
        return lambda n: n * n  # ①
    elif type == 'cube':
        return lambda n: n * n * n  # ②
    else:
        return lambda n: (1 + n) * n / 2 # ③


# 調用get_math_func(),程序返回一個嵌套函數
math_func = get_math_func("cube")
print(math_func(5)) # 輸出125
math_func = get_math_func("square")
print(math_func(5)) # 輸出25
math_func = get_math_func("other")
print(math_func(5)) # 輸出15.0

若是使用 lambda 表達式來簡化 get_math_func() 函數,則能夠將程序改寫成以下形式:編程語言

在上面代碼中,return 後面的部分使用 lambda 關鍵字定義的就是 lambda 表達式,Python 要求 lambda 表達式只能是單行表達式。函數

注意:因爲 lambda 表達式只能是單行表達式,不容許使用更復雜的函數形式,所以上面 ③ 號代碼處改成計算 1+2+3+…+n 的總和。性能


lambda 表達式的語法格式以下:spa

lambda [parameter_list] : 表達式

從上面的語法格式能夠看出 lambda 表達式的幾個要點:.net

  • lambda 表達式必須使用 lambda 關鍵字定義。
  • 在 lambda 關鍵字以後、冒號左邊的是參數列表,能夠沒有參數,也能夠有多個參數。若是有多個參數,則須要用逗號隔開,冒號右邊是該 lambda 表達式的返回值。


實際上,lambda 表達式的本質就是匿名的、單行函數體的函數。所以,lambda 表達式能夠寫成函數的形式。

例如,對於以下 lambda 表達式:code

lambda x , y: x + y

可改寫爲以下函數形式:htm

def add(x, y):
    return x+ y

上面定義函數時使用了簡化語法:當函數體只有一行代碼時,能夠直接把函數體的代碼放在與函數頭同一行。

整體來講,函數比 lambda 表達式的適應性更強,lambda 表達式只能建立簡單的函數對象(它只適合函數體爲單行的情形)。但 lambda 表達式依然有以下兩個用途:

  • 對於單行函數,使用 lambda 表達式能夠省去定義函數的過程,讓代碼更加簡潔。
  • 對於不須要屢次複用的函數,使用 lambda 表達式能夠在用完以後當即釋放,提升了性能。


下面代碼示範了經過 lambda 表達式來調用 Python 內置的 map() 函數:

# 傳入計算平方的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*x if x % 2 == 0 else 0, range(8))
print([e for e in y]) # [0, 0, 4, 0, 16, 0, 36, 0]

正如從上面代碼所看到的,內置的 map() 函數的第一個參數須要傳入函數,此處傳入了函數的簡化形式:lambda 表達式,這樣程序更加簡潔,並且性能更好。

總結

本節所介紹的 lambda 表達式是 Python 編程的核心機制之一。Python 語言既支持面向過程編程,也支持面向對象編程。而 lambda 表達式是 Python 面向過程編程的語法基礎,所以讀者必須引發重視。 Python 的 lambda 表達式只是單行函數的簡化版本,所以 lambda 表達式的功能比較簡單。

相關文章
相關標籤/搜索