Python基礎十九 lambda表示式

2021-09-25 05:28:51 字數 1884 閱讀 9549

在學習python的過程中,lambda的語法時常會使人感到困惑,lambda是什麼,為什麼要使用lambda,是不是必須使用lambda?

下面就上面的問題進行一下解答。

lambda是什麼?

看個例子:

g = lambda x:x+1

看一下執行的結果:

g(1)

2

g(2)

當然,你也可以這樣使用:

lambda x:x+1(1)

可以這樣認為,lambda作為乙個表示式,定義了乙個匿名函式,上例的**x為入口引數,x+1為函式體,用函式來表示為:

def g(x):2 return x+1

非常容易理解,在這裡lambda簡化了函式定義的書寫形式。是**更為簡潔,但是使用函式的定義方式更為直觀,易理解。

python中,也有幾個定義好的全域性函式方便使用的,filter, map, reduce:

foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]

print filter(lambda x: x % 3 == 0, foo)

[18, 9, 24, 12, 27]

print map(lambda x: x * 2 + 10, foo)

[14, 46, 28, 54, 44, 58, 26, 34, 64]

print reduce(lambda x, y: x + y, foo)

139

上面例子中的map的作用,非常簡單清晰。但是,python是否非要使用lambda才能做到這樣的簡潔程度呢?在物件遍歷處理方面,其實python的for…in…if語法已經很強大,並且在易讀上勝過了lambda。

比如上面map的例子,可以寫成:

print [x * 2 + 10 for x in foo]

非常的簡潔,易懂。

filter的例子可以寫成:

print [x for x in foo if x % 3 == 0]

同樣也是比lambda的方式更容易理解。

上面簡要介紹了什麼是lambda,下面介紹為什麼使用lambda,看乙個例子(來自apihelper.py):

processfunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)

在visual basic,你很有可能要建立乙個函式,接受乙個字串引數和乙個 collapse 引數,並使用 if語句確定是否壓縮空白,然後再返回相應的值。這種方式是低效的,因為函式可能需要處理每一種可能的情況。每次你呼叫它,它將不得不在給出你所想要的東西之前,判斷是否要壓縮空白。在 python 中,你可以將決策邏輯拿到函式外面,而定義乙個裁減過的 lambda函式提供確切的 (唯一的) 你想要的。這種方式更為高效、更為優雅,而且很少引起那些令人討厭 (哦,想到那些引數就頭昏) 的錯誤。

通過此例子,我們發現,lambda的使用大量簡化了**,使**簡練清晰。但是值得注意的是,這會在一定程度上降低**的可讀性。如果不是非常熟悉python的人或許會對此感到不可理解。

lambda 定義了乙個匿名函式

lambda 並不會帶來程式執行效率的提高,只會使**更簡潔。

如果可以使用for…in…if來完成的,堅決不用lambda。

如果使用lambda,lambda內不要包含迴圈,如果有,我寧願定義函式來完成,使**獲得可重用性和更好的可讀性。

總結:lambda 是為了減少單行函式的定義而存在的。

Python基礎刻意練習 函式與lambda表示式

本系列定位為複習筆記,某些內容並未提及。在此記錄一些典型疑問和我在學習中的問題或經常遺忘的細節,也會新增一些覺得有意思的部分 其實就是隨心所欲 內容主要使用 進行傳達 def printme str print str printme 1 printme 2 temp printme hello p...

python基礎教程之匿名函式lambda

python lambda 當我們在使用函式時,有時候,並不需要顯示的定義乙個函式,我們可以使用匿名函式更加方便,程式設計客棧在python中對匿名函式也提供了支援。比如當我們想計算兩個數a,b之和時,即f a,b a b。我們可以有兩種方法完成,第一種就是顯示的定義乙個函式f x,y 然後將引數傳...

Linux基礎(十九)

進入linux字元介面方式有字元介面 圖形介面下的終端以及虛擬控制台等方式。在字元介面下,虛擬控制台的選擇可以通過按下 alt 鍵和1個功能鍵來實現,功能鍵通常為f1 f6鍵。比如使用者登入後,按下 alt f2 鍵,使用者可以看 login 提示符,說明使用者進入了第2個虛擬控制台。然後只需利用按...