在學習python的過程中,lambda的語法時常會使人感到困惑,lambda是什麼,為什麼要使用lambda,是不是必須使用lambda?
下面就上面的問題進行一下解答。
lambda是什麼?
看個例子:
g = lambda x:x+1
看一下執行的結果:
g(1)
2g(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個虛擬控制台。然後只需利用按...