匿名函數(shù)
有沒有想過定義一個很短的回調(diào)函數(shù),但又不想用 def 的形式去寫一個那么長的函數(shù),那么有沒有快捷方式呢?答案是有的。
python 使用 lambda 來創(chuàng)建匿名函數(shù),也就是不再使用 def 語句這樣標準的形式定義一個函數(shù)。
匿名函數(shù)主要有以下特點:
lambda 只是一個表達式,函數(shù)體比 def 簡單很多。
lambda 的主體是一個表達式,而不是一個代碼塊。僅僅能在 lambda 表達式中封裝有限的邏輯進去。
lambda 函數(shù)擁有自己的命名空間,且不能訪問自有參數(shù)列表之外或全局命名空間里的參數(shù)。
基本語法
lambda [arg1 [,arg2,.....argn]]:expression
示例:
# -*- coding: UTF-8 -*- sum = lambda num1 , num2 : num1 + num2; print( sum( 1 , 2 ) )
輸出的結(jié)果:
3
注意:盡管 lambda 表達式允許你定義簡單函數(shù),但是它的使用是有限制的。 你只能指定單個表達式,它的值就是最后的返回值。也就是說不能包含其他的語言特性了, 包括多個語句、條件表達式、迭代以及異常處理等等。
匿名函數(shù)中,有一個特別需要注意的問題,比如,把上面的例子改一下:
# -*- 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,結(jié)果不是的,輸出的結(jié)果是這樣:
10001 10001
這主要在于 lambda 表達式中的 num2 是一個自由變量,在運行時綁定值,而不是定義時就綁定,這跟函數(shù)的默認值參數(shù)定義是不同的。所以建議還是遇到這種情況還是使用第一種解法。