匿名函數lambdapython
除了def語句,python還提供了一種生成函數對象的表達式形式。因爲它與LISP語言中的一個工具相似,因此稱爲lambda。express
就像def同樣,這個表達式建立了一個以後可以調用的函數,可是它返回一個函數而不是將這個函數賦值給一個變量。這些就是lambda叫作匿名函數的緣由。實際上,他經常以一種行內進行函數定義的方式使用,或者用做推遲執行一些代碼。數據結構
lambda的通常形式是關鍵字lambda以後跟着一個或多個參數(與一個def頭部內用括號括起來的參數列表相似),緊跟着是一個冒號,以後是表達式app
lambda arg1,arg2,argn:expression using arguments
由lambda表達式所返回的函數對象與由def建立並複製後的函數對象工做起來是徹底一致的,但lambda有一些不一樣之處,讓其扮演特定的角色時更有用:ide
lambda是一個表達式,而不是一個語句函數
由於這一點,lambda能夠出如今python語法不容許def出現的地方。
此外,做爲一個表達式,lambda返回一個值(一個新的函數),能夠選擇性的賦值給一個變量
相反,def語句老是得在頭部將一個新的函數賦值給一個變量,而不是將這個函數做爲結果返回。工具
lambda的主題是單個表達式,而不是一個代碼塊學習
這個lambda的主題簡單的就好像放在def主體return語句中的代碼同樣。
簡單的將結果寫成一個順暢的表達式,而不是明確的返回。
但因爲它僅限於表達式,故lambda一般要比def功能少…你僅可以在lambda主體中封裝有限的邏輯進去,由於他是一個爲編寫簡單函數而設計的。
除了上述這些差異,def和lambda都能過作一樣種類的工做設計
def與lambda的相同用法code
x = lambda x, y, z: x + y + z x(2, 3, 4) >>> 9 y = (lambda a='hello', b='world': a + b) y(b='Python') >>> 'hellopython'
爲何使用lambda
看過上面的兩個小例子,不少人會說這個和def沒什麼差異,咱們又爲何要使用lambda呢?
一般來講,lambda起到一種函數的速寫做用,容許在使用的代碼內嵌一個函數的定義,他徹底是可選的(是可使用def代替他們),可是在你僅須要切入一段可執行代碼的狀況下,它會帶來一個更簡潔的書寫效果。
lambda一般用來編寫跳轉表,也就是行爲的列表或者字典,可以按照需求執行操做,好比:
''' 遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:857662006 尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書! ''' l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4] for f in l: print(f(2)) >>> 4 >>> 8 >>> 16 print(l[0](3)) >>> 9
當須要把小段的可執行代碼編寫進def語句從語法上不能實現的地方是,lambda表達式做爲def的一種速寫來講,是最爲有用的,若是上面的代碼用def編寫,則變爲:
def f1(x): return x ** 2 def f2(x): return x ** 3 def f3(x): return x ** 4 l = [f1, f2, f3] for f in l: print(f(2)) print(l[0](3))
實際上,咱們能夠用python中的字典或者其餘的數據結構來構建更多種類的行爲表,從而作一樣的事情。
lambda中實現if-else
Python中具有的單行表達式:if a:b else c語法在lambda中一樣適用:
lower = lambda x,y:x if x<y else y lower(4,5) >>> 4
看了半天,你們可能也並未以爲lambda在python中到底比def優越與便利在哪裏,那麼說到lambda,就必需要說起三個函數map、filter、reduce,當你接觸了這三個函數,那麼你才能感覺到lambda真實的方便之處
map 函數
程序對列表或者其餘序列經常要作的一件事就是對每一個元素進行一個操做,並把其結果集合起來。
python提供了一個工具map,它會對一個序列對象中的每個元素應用該的函數,並返回一個包含了全部函數調用結果的列表。
舉個栗子,咱們有一個列表,須要將列表的每個字段+10,咱們該如何操做?
''' 遇到問題沒人解答?小編建立了一個Python學習交流QQ羣:857662006 尋找有志同道合的小夥伴,互幫互助,羣裏還有不錯的視頻學習教程和PDF電子書! ''' list_show = [1, 2, 3, 4] # 方式1 new_list_show = [] for i in list_show: new_list_show.append(i + 10) print(new_list_show) # 方式2 def adds(x): return x + 10 print(list(map(adds, list_show))) # 更優雅的方式3: print(list(map(lambda x: x + 10, list_show)))
看看上面三個實現方式,你以爲那種更加Pythonic?
eg:須要注意一點,map在python3中是一個可迭代對象,引入須要使用列表調用來使它生成全部的結果用於顯示,python2沒必要如此。
固然map的闡述函數,不只僅支持本身編寫的,一樣也支持python自帶的多種函數,好比:
list_show = [1, -2, 3, -4, 5, -6] print(list(map(abs, list_show))) >>> [1, 2, 3, 4, 5, 6]
filter函數
filter經過字面意思,你們就知道它的用處了,用於數據的過濾操做,它也是lambda的一個好基友,舉個栗子。
咱們須要過濾0-9中,能被2整除的數字組成一個列表,咱們該如何操做?只須要一行代碼:
print(list(filter(lambda x: x % 2 == 0, range(10)))) >>> [0, 2, 4, 6, 8]
沒錯,filter就是這麼的簡單實用….
reduce的妙用
reduce在python2中是一個簡單的函數,但在python3中它責備收錄與functools中。
它接收一個迭代器來處理並返回一個單個的結果。
list_show = [1, 2, 3, 4] print(reduce(lambda x, y: x + y, list_show)) >>> 10 print(reduce(lambda x, y: x * y, list_show)) >>> 24
lambda的實用與它的好基友就介紹到這裏,但願對你們有所幫助。