匿名函數

有沒有想過定義一個很短的回呼函數,但又不想用 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 是一個自由變量,在運行時綁定值,而不是定義時就綁定,這跟函數的預設值參數定義是不同的。所以建議還是遇到這種情況還是使用第一種解法。

繼續學習