python使用lambda關鍵字創造匿名函式。所謂匿名,意即不再使用def語句這樣標準的形式定義乙個函式。這種語句的目的是由於效能的原因,在呼叫時繞過函式的棧分配。其語法是:
lambda [arg1[, arg2, ... argn]]: expression
其中,引數是可選的,如果使用引數的話,引數通常也會在表示式之中出現。
下面舉例來說明lambda語句的使用方法(無引數)。
# 使用def定義函式的方法
deftrue
():return
true
#等價的lambda表示式
>>>
lambda :true
lambda> at 0x0000000001e42518>
# 保留lambda物件到變數中,以便隨時呼叫
>>> true = lambda :true
>>> true()
true
下面再舉乙個帶引數的例子。
# 使用def定義的函式
defadd
( x, y ):
return x + y
# 使用lambda的表示式
lambda x, y: x + y
# lambda也允許有預設值和使用變長引數
lambda x, y = 2: x + y
lambda *z: z
# 呼叫lambda函式
>>> a = lambda x, y: x + y
>>> a( 1, 3 )
4>>> b = lambda x, y = 2: x + y
>>> b( 1 )
3>>> b( 1, 3 )
4>>> c = lambda *z: z
>>> c( 10, 'test')
(10, 'test')
但由於lambda表示式特殊的設計,在特定的場景中也帶來了一些不同的體驗。
另外,lambda表示式是可以巢狀的
>>> action = (lambda x : (lambda y : x + y))
>>> a = action(10)
>>> a(5)
15
這就是乙個用lambda實現的閉包,與普通閉包一樣,內嵌lambda表示式可以獲得上層lambda函式的變數。
匿名函式的使用
匿名函式通常被用作高階函式(higher-order function,引數為函式的函式)的引數。比如,幾個內建函式:filter(),map(),reduce()。下面我們分別看看這幾個函式的用法及達到相同效果的python另一種特徵的用法
filter函式
>>> result = filter(lambda x: x%2==0, list)
>>> result
[2]>>> result = [x for x in
list
if x%2==0]
>>> result
[2]
map函式
>>> result
[2, 4, 6]
>>> result = [x*2
for x in
list]
>>> result
[2, 4, 6]
reduce函式
>>> result
6>>> result = sum(list)
>>> result
6除reduce函式的替代用法比較特殊外,map和filter函式都可以使用列表推導式(list comprehension)代替。據說,當年lambda是乙個lisp程式設計師給python加的,而guido是強烈反對的,他中意的是列表推導式。
跳轉表(jump table)
lambda的另一種用法是用來編寫跳轉表,也就是行為列表或字典,能按需執行特定的動作。
>>> key = "get"
>>> [key]()
8
這樣在字典中,每個lambda都留下了乙個後續可以呼叫的函式,通過索引可以取出來,並呼叫。這就使字段可以成為更加通用的多路分支工具。 python基礎教程之匿名函式lambda
python lambda 當我們在使用函式時,有時候,並不需要顯示的定義乙個函式,我們可以使用匿名函式更加方便,程式設計客棧在python中對匿名函式也提供了支援。比如當我們想計算兩個數a,b之和時,即f a,b a b。我們可以有兩種方法完成,第一種就是顯示的定義乙個函式f x,y 然後將引數傳...
內建函式filter 和匿名函式lambda解析
一.內建函式filter filter 函式是 python 內建的乙個高階函式,filter 函式接收乙個函式 f 和乙個list,這個函式 f 的作用是對每個元素進行判斷,返回由符合條件迭代器 python3以下版本返回是列表 語法 filter function or none,iterabl...
Python基礎刻意練習 函式與lambda表示式
本系列定位為複習筆記,某些內容並未提及。在此記錄一些典型疑問和我在學習中的問題或經常遺忘的細節,也會新增一些覺得有意思的部分 其實就是隨心所欲 內容主要使用 進行傳達 def printme str print str printme 1 printme 2 temp printme hello p...