Python 匿名函式lambda

2021-07-09 08:47:25 字數 1420 閱讀 6238

今天看yate內嵌python的例子,竟然又一次忘記了lambda到底是個什麼東東,too faint!特標記如下。

例子:[python]view plain

copy

defroute(yate):  

defon_route(route):  

...  

yate.onmsg("call.route"

,  lambda

m : m[

"called"

] == 

"ivr"

).addcallback(on_route)  

在python中使用lambda來建立匿名函式。lambda**於lisp語言。lambda的形式如下:

lambda會建立乙個函式物件,但不會把這個函式物件賦給乙個識別符號,而def則不同,它在建立函式物件的同時會進行這種操作。這是lambda的第乙個特點。lambda的第二個特點是,它只是乙個表示式,而不是乙個語句。如果單獨使它成為了乙個語句,比如:

如果你在你的python程式中寫下了這麼一行,那麼毫無意義,這一行**會建立乙個函式物件,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函式物件。也正是由於lambda只是乙個表示式,它可以直接作為list或dictionary的成員,比如:

在這個地方沒有辦法用def語句直接代替。第三,lambda表示式在「:」後只能有乙個表示式。也就是說,在def中,可以放在return後的也可以放在lambda,不能放在return後也不能放在這裡。更本質地說,後面的表示式是能夠返回乙個值的,不能返回值的不能放在這裡。因此,像if或for或print這種語句就不能用於lambda中,lambda一般只用來定義簡單的函式。當然,通過一些技巧,可以在lambda中實現與if或for相同的功能。比如:if語句可以利用and和or這兩個邏輯操作符的「短路」特性來模擬,比如:

這樣的話,如果test為真,那麼就會計算[x],當然得到的就是[x],由於在or操作符的左邊已經得到真值,or的右邊就不會被計算,因此得到的是[x][0],最後的結果是x。如果test為假,那麼根據and的特性,左邊已經為假,右邊不會被計算。這時or的左邊為假那麼就得到[y][0],最後的結果是y。注意在這裡不能寫成如下的形式:

在x為真值時,這種形式與上面這種形式是等價的。但設想這種情況,「如果test為真,則取0,如果test為假,則取」,也就是說x本身是乙個假值,用上面的形式書寫就是:

顯然不能達到目的,這個式子永遠只會取到。因此應該改寫成:

在lambda中迴圈語句也是可以模擬的,用的是map函式。比如:

當然,這種東西看起來就很複雜,如果可能最好不要巢狀使用lambda。print也是可以模擬的:

import sys

pp = lambda x: sys.stdout.write(str(x)+'/n')

pp(8) ===> 8

上面部分引自:

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...