python lambda 判断_Python lambda
引言
前段時間,沒事兒時翻看了自己剛參加工作時寫的一些代碼,發(fā)現(xiàn)代碼中有好幾處分別都用到了lambda表達式,從代碼中會發(fā)現(xiàn)那時候的自己對lambda理解的不算深刻,lambda的本質,為什么要用lambda而不用def定義函數(shù)等這些都沒有系統(tǒng)的掌握。于是后面花了一些時間重新梳理了自己對lambda的認識。
lambda介紹
lambda是python中的一個關鍵字,實際開發(fā)中常用lambda表達式的方式創(chuàng)建匿名函數(shù),比如 lambda a, b: a+b,表示定義了一個匿名函數(shù),該函數(shù)包含a、b兩個參數(shù),并返回a與b的和。lambda表達式返回的是一個函數(shù)對象,可通過函數(shù)對象來調用定義的匿名函數(shù),比如my_func = lambda a, b: a+b,my_func(2, 3)則表示調用lambda定義的匿名函數(shù);(lambda a, b: a + b)(2, 3)則是另一種調用方式,具體操作如下:
>>> my_func = lambda a, b: a + b
>>> type(my_func)
>>> my_func
at 0x0000000002E60438>
>>> my_func(2, 3)
5
>>> (lambda a, b: a + b)(2, 3)
5
剖析lambda創(chuàng)建匿名函數(shù)
lambda定義匿名函數(shù)的格式為:lambda parameters: expression,其中parameters表示定義一個或多個參數(shù),參數(shù)類型與def一樣,支持普通參數(shù)、默認參數(shù)、可變參數(shù)、關鍵字參數(shù)。lambda定義的匿名函數(shù)等價于如下的函數(shù)定義:
def (parametes):
return expression
# 指函數(shù)名稱
比如:lambda x: x + 2 等價于 def func_name(x): return x + 2;lambda a, b: a ** b 等價于 def func_name(a, b): return a ** b。其中func_name是自定義的函數(shù)名,我們也可以通過dis工具分析def與lambda定義的兩類函數(shù)的字節(jié)碼的關系:
>>> import dis
>>> def my_func(a, b, c):
return (a + b) * c
>>> dis.dis(my_func)
3 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 LOAD_FAST 2 (c)
10 BINARY_MULTIPLY
11 RETURN_VALUE
>>> dis.dis(lambda a, b, c: (a + b) * c)
2 0 LOAD_FAST 0 (a)
3 LOAD_FAST 1 (b)
6 BINARY_ADD
7 LOAD_FAST 2 (c)
10 BINARY_MULTIPLY
11 RETURN_VALUE
可知,兩個函數(shù)分別都是先對a、b變量做引用的push stack操作,然后執(zhí)行相加,
緊接著對變量c做push stack操作,接著與a、b的和進行相乘,最后返回結果
再次說明lambda parameters: expression 等價于 def (parametes): return expression
lambda特點
lambda是一個表達式,而不是一個語句
lambda_expr ::= "lambda" [parameter_list]: expression
lambda是只有一行的簡單表達式,并不能擴展成一個多行的代碼塊
Python文檔說到,lambda不能包含語句,這是因為Python的語法框架無法處理嵌套在表達式中的語句。lambda可以接收多個參數(shù),但只能有一個包含這些參數(shù)計算的表達式。這意味著lambda中不會含有if... elif... else 或者 try... except等語句,lambda的設計主要是用來計算簡單的任務。
lambda使用場景
在平時的開發(fā)過程中,使用def而非lambda定義函數(shù)足夠完成各種功能的開發(fā),但適當?shù)氖褂胠ambda能夠讓我們的代碼更加簡潔明了。那在什么樣的場景下推薦使用lambda呢?
一個小的功能函數(shù),只需要一行就能完成,且只會被調用一次
比如要對整數(shù)列表中的所有元素添加存儲單位的操作:
>>> def add_unit(num):
return '{}mb'.format(num)
>>> map(add_unit, range(5))
['0mb', '1mb', '2mb', '3mb', '4mb']
>>> map(lambda n: '{}mb'.format(n), range(5))
['0mb', '1mb', '2mb', '3mb', '4mb']
# 可見,使用lambda的代碼更加簡潔
編程中與高階函數(shù)聯(lián)合使用
實際開發(fā)中,lambda更多的是與map、filter、reduce等高階函數(shù)搭配使用,因為這些函數(shù)中需要接收函數(shù)對象作為參數(shù),使用lambda達到了既定義函數(shù)又傳遞函數(shù)的目的,比如map(lambda x: x ** 2, range(5)),這里的lambda x: x ** 2先定義函數(shù),然后將此函數(shù)對象作為參數(shù)傳遞給map;如果是def則需要首先在外部定義這個函數(shù),而不能在map函數(shù)中直接通過def來定義,map(def..., range(5)),Python不允許這樣的語法。
lambda注意點
上面講到lambda的特點是只能有一個表達式,使用lambda的目的是為了讓代碼更加簡潔明了,所以在使用過程中需要注意以下幾點:
lambda專注完成簡單的任務,其表達式要易讀
不推薦在編碼中為了使用lambda而將表達式寫的很繁瑣,就像Python文檔中說到的reduce(lambda a, b: (0, a[1] + b[1]), items)[1]這個表達式,你能很快看出lambda函數(shù)的意圖嗎?答案是不能,所以對于復雜點的邏輯,最好不要用lambda
程序中多處都會用一個小函數(shù)功能,則建議用def定義這個小函數(shù)
對列表中的數(shù)字求平方,lambda表達式為lambda n: n ** 2,簡單,易讀。如果程序中不止一處需要對數(shù)字求平方,若均使用lambda,則顯得代碼冗余
開發(fā)中先def,后lambda
在實際開發(fā)過程中,我傾向于把不管什么類型的函數(shù)均先通過def來定義,等程序開發(fā)接近尾聲的時候,再依據(jù)簡單任務、只用一次的原則看看把哪些def定義的函數(shù)可以替換成lambda匿名函數(shù),并寫上必要的注釋
謹慎使用lambda
其實從Python文檔函數(shù)式編程的說明部分可以了解到,文檔作者傾向于不使用lambda,原因就是lambda的單個表達式、無法擴展多行代碼塊等自身的功能限制。所以我們一定要秉持小函數(shù)、簡單任務、只用一次的原則來決定是否要用lambda,千萬別寫出了大家半天都看不太明白的lambda表達式
總結
花了一些時間,重新梳理了自己對lambda的認識,Python文檔常把lambda與小函數(shù)綁定在一起,因此我們對lambda的使用要依據(jù)小函數(shù)、簡單任務、只用一次的原則。引入lambda是為了讓代碼更加簡潔明了,萬不可為了少寫代碼、為了簡潔而寫出了很復雜的表達式,簡潔明了與易讀都是需要的。以上就是我對lambda的認識,您有什么不一樣的看法嗎?歡迎一起交流。
引用
總結
以上是生活随笔為你收集整理的python lambda 判断_Python lambda的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是IP Routing
- 下一篇: AC---上网行为管理