匿名函數
有沒有想過定義一個很短的回呼函數,但又不想用 def 的形式去寫一個那麼長的函數,那麼有沒有快捷方式呢?答案是有的。
python 使用 lambda 來建立匿名函數,也就是不再使用 def 語句這樣標準的形式定義一個函數。
匿名函數主要有以下特點:
lambda 只是一個表達式,函數體比 def 簡單很多。
lambda 的主體是一個表達式,而不是一個程式碼區塊。僅僅能在 lambda 表達式中封裝有限的邏輯進去。
lambda 函數擁有自己的命名空間,且無法存取自有參數清單以外或全域命名空間裡的參數。
基本語法
lambda [arg1 [,arg2,.....argn]]:expression
範例:
# -*- coding: UTF-8 -*- sum = lambda num1 , num2 : num1 + num2; print( sum( 1 , 2 ) )
輸出的結果:
3
注意:儘管lambda 表達式允許你定義簡單函數,但是它的使用是有限制的。你只能指定單一表達式,它的值就是最後的回傳值。也就是說不能包含其他的語言特性了, 包括多個語句、條件表達式、迭代以及異常處理等等。
匿名函數中,有一個特別要注意的問題,例如,把上面的例子改一下:
# -*- coding: UTF-8 -*- num2 = 100 sum1 = lambda num1 : num1 + num2 ; num2 = 10000 sum2 = lambda num1 : num1 + num2 ; print( sum1( 1 ) ) print( sum2( 1 ) )
你會認為輸出什麼呢?第一個輸出是101,第二個是10001,結果不是的,輸出的結果是這樣:
10001 10001
這主要在於lambda 表達式中的num2 是一個自由變量,在運行時綁定值,而不是定義時就綁定,這跟函數的預設值參數定義是不同的。所以建議還是遇到這種情況還是使用第一種解法。