詳解Python匿名函數(lambda函數)
匿名函數lambda
Python使用lambda關鍵字創(chuàng)造匿名函數。所謂匿名,意即不再使用def語句這樣標準的形式定義一個函數。這種語句的目的是由于性能的原因,在調用時繞過函數的棧分配。其語法是:
lambda [arg1[, arg2, ... argN]]: expression
其中,參數是可選的,如果使用參數的話,參數通常也會在表達式之中出現。
下面舉例來說明lambda語句的使用方法(無參數)。
# 使用def定義函數的方法 def true(): return True #等價的lambda表達式 >>> lambda :True <function <lambda> at 0x0000000001E42518> # 保留lambda對象到變量中,以便隨時調用 >>> true = lambda :True >>> true() True
下面再舉一個帶參數的例子。
# 使用def定義的函數 def add( 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是一個表達式,不是一個語句 這就使它能夠出現在一些def不能出現的地方,比如,列表常量中。
lambda是單個的表達式,不是一個代碼塊 lambda的設計是為了滿足簡單函數的場景,僅能封裝有限的邏輯,有復雜邏輯的情況有def來處理,所以lambda的功能要比def小的多。
另外,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函數
>>> list = [1, 2, 3] >>> result = filter(lambda x: x%2==0, list) >>> result [2] >>> result = [x for x in list if x%2==0] >>> result [2]
map函數
>>> result = map(lambda x: x*2, list) >>> result [2, 4, 6] >>> result = [x*2 for x in list] >>> result [2, 4, 6]
reduce函數
>>> result = reduce(lambda x, y: x+y,list) >>> result 6 >>> result = sum(list) >>> result 6
除reduce函數的替代用法比較特殊外,map和filter函數都可以使用列表推導式(list comprehension)代替。據說,當年lambda是一個Lisp程序員給python加的,而Guido是強烈反對的,他中意的是列表推導式。
跳轉表(jump table)
lambda的另一種用法是用來編寫跳轉表,也就是行為列表或字典,能按需執(zhí)行特定的動作。
>>> key = "get"
>>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}[key]()
8
這樣在字典中,每個lambda都留下了一個后續(xù)可以調用的函數,通過索引可以取出來,并調用。這就使字段可以成為更加通用的多路分支工具。
以上所述是小編給大家介紹的Python匿名函數(lambda函數)詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!
相關文章
解讀MaxPooling1D和GlobalMaxPooling1D的區(qū)別
這篇文章主要介紹了MaxPooling1D和GlobalMaxPooling1D的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12
Python 使用 consul 做服務發(fā)現示例詳解
這篇文章主要介紹了Python 使用 consul 做服務發(fā)現示例詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
如何查看Django ORM執(zhí)行的SQL語句的實現
這篇文章主要介紹了如何查看Django ORM執(zhí)行的SQL語句的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
在Ubuntu系統(tǒng)下安裝使用Python的GUI工具wxPython
這篇文章主要介紹了在Ubuntu系統(tǒng)下安裝使用Python的GUI工具wxPython的方法,wxPython可以為Python提供強大的圖形化界面開發(fā)支持,需要的朋友可以參考下2016-02-02

