匿名函數指一類無須定義標識符的函數或子程式。Python用lambda語法定義匿名函數,只需用表達式而無需申明。lambda語法的定義如下: 有些時候,當我們在傳入函數時,不需要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是只能有一個表達式,無需寫return,返回值就是該表達式的結 ...
匿名函數指一類無須定義標識符的函數或子程式。Python用lambda語法定義匿名函數,只需用表達式而無需申明。
lambda語法的定義如下:
lambda [arg1 [,arg2, ... argN]] : expression
有些時候,當我們在傳入函數時,不需要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是只能有一個表達式,無需寫return,返回值就是該表達式的結果。用匿名函數有個好處,因為函數沒有名字,不必擔心函數名衝突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變數,再利用變數來調用該函數
實例:
# 可寫函數說明 sum = lambda arg1, arg2: arg1 + arg2 # 調用sum函數 print("相加後的值為 : ", sum(10, 20)) print("相加後的值為 : ", sum(20, 20))
以上代碼,輸出:
相加後的值為 : 30
相加後的值為 : 40
在定義時直接被調用,比如:
print((lambda x, y: x-y)(3, 4))
以上代碼,輸出:
-1
但通常都是在定義lambda函數的同時將其應用作為參數傳遞給另一個函數,該函數在其處理過程中對lambda定義的函數進行調用,例如:
L = [1, 2, 3, 4, 5, 6, 7, 8] # 過濾掉所有的偶數 res = filter(lambda x: x % 2 == 1, L) print(list(res))
以上代碼,輸出:
[1, 3, 5, 7]
上面幾個實例都是比較簡單的,我們再來看幾個複雜的。假如,我們要找出兩個數中小的那一個,我們可以用lambda這麼寫:
fn = lambda x, y: x if x < y else y print(fn(1, 2))
以上代碼,輸出:
1
在上面的實例中,函數體里的那種寫法,實際上是python中的三元表達式(三目運算符)。在Python中,語法如下:
為真時的結果 if 判定條件 else 為假時的結果
例如:
1 if 5>3 else 0
是先輸出結果,再判定條件,輸出1,如果5大於3,否則輸出0
再來幾個更複雜的,後面這幾個如果你是初學者,可以略過!
柯里化(什麼是柯里化?https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin):
res = (lambda x: (lambda y: (lambda z: x + y + z)(1))(2))(3) print(res)
以上代碼,輸出:
6
遞歸:
func = lambda n: 1 if n == 0 else n * func(n-1) print(func(5))
以上代碼,輸出:
120
或
f = lambda func, n: 1 if n == 0 else n * func(func, n - 1) print(f(f, 4))
以上代碼,輸出:
24
匿名函數有以下幾個特點:
- lambda 只是一個表達式,函數體比 def 簡單很多。
- lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda 函數擁有自己的命名空間,像嵌套的函數定義,lambda 函數可以從包含它的作用域中引用變數。