(二十)python 3 匿名函数
匿名函數(shù)lambda
Python使用lambda關(guān)鍵字創(chuàng)造匿名函數(shù)。所謂匿名,意即不再使用def語句這樣標(biāo)準(zhǔn)的形式定義一個函數(shù)。這種語句的目的是由于性能的原因,在調(diào)用時繞過函數(shù)的棧分配。其語法是:
lambda [arg1[, arg2, ... argN]]: expression
其中,參數(shù)是可選的,如果使用參數(shù)的話,參數(shù)通常也會在表達(dá)式之中出現(xiàn)。
無參數(shù)
# 使用def定義函數(shù)的方法 def true():return True#等價的lambda表達(dá)式 >>> lambda :True <function <lambda> at 0x0000000001E42518># 保留lambda對象到變量中,以便隨時調(diào)用 >>> true = lambda :True >>> true() True一個參數(shù)
# 使用def定義的函數(shù) def add( x, y ):return x + y# 使用lambda的表達(dá)式 lambda x, y: x + y# lambda也允許有默認(rèn)值和使用變長參數(shù) lambda x, y = 2: x + y lambda *z: z# 調(diào)用lambda函數(shù) >>> 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是單個的表達(dá)式,不是一個代碼塊 lambda的設(shè)計是為了滿足簡單函數(shù)的場景,僅能封裝有限的邏輯,有復(fù)雜邏輯的情況有def來處理,所以lambda的功能要比def小的多
lambda表達(dá)式是可以嵌套的(閉包)
>>> action = (lambda x : (lambda y : x + y)) >>> a = action(10) >>> a(5) 15匿名函數(shù)的使用
匿名函數(shù)通常被用作高階函數(shù)(higher-order function,參數(shù)為函數(shù)的函數(shù))的參數(shù)。比如,幾個內(nèi)置函數(shù):filter(),map(),reduce()。下面我們分別看看這幾個函數(shù)的用法及達(dá)到相同效果的python另一種特征的用法
filter函數(shù)
>>> 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函數(shù)
>>> result = map(lambda x: x*2, list) >>> result [2, 4, 6] >>> result = [x*2 for x in list] >>> result [2, 4, 6]reduce函數(shù)
>>> result = reduce(lambda x, y: x+y,list) >>> result 6 >>> result = sum(list) >>> result 6跳轉(zhuǎn)表(jump table)
lambda的另一種用法是用來編寫跳轉(zhuǎn)表,也就是行為列表或字典,能按需執(zhí)行特定的動作。
>>> key = "get" >>> {"abc":(lambda : 2 + 2),"bcd" : (lambda : 3 + 3), "get" : (lambda : 4 + 4)}[key]() 8
注意問題:
x = 10 a = lambda y: y + xx = 20 b = lambda y: y + x#猜想一下:a(10) 和 b(10)返回的結(jié)果是什么?如果你認(rèn)為結(jié)果是20 和 30,那么就錯了print(a(10)) ##輸出:30print(b(10)) ##輸出:30lambda表達(dá)式中的x是一個自由變量, 是在運行時綁定值,而不是定義時就綁定,即lambda表達(dá)式中的x是執(zhí)行時的值,這與函數(shù)的默認(rèn)值參數(shù)定義是不同的。例如:
x = 15 print(a(10)) ##輸出:25x = 3 print(a(10)) ##輸出:13如果想讓匿名函數(shù),在定義時就捕獲到參數(shù)值,可以將那個參數(shù)值定義成默認(rèn)參數(shù)即可,例如:
m = 4 c = lambda n, m = m: m + nprint(c(10)) ##輸出:14m = 2 print(c(10)) ##輸出:14
有時候,可能會不恰當(dāng)?shù)氖褂胠ambda表達(dá)式。 比如,通過在一個循環(huán)或列表推導(dǎo)中創(chuàng)建一個lambda表達(dá)式列表,并期望函數(shù)能在定義時就記住每次的迭代值。例如:
funcs = [lambda x: x+n for n in range(3)] for f in funcs:print(f(0))# 2 # 2 # 2但是實際效果是,n的值為迭代的最后一個值。將參數(shù)值設(shè)置為默認(rèn)參數(shù),才能得到想要的效果,修改代碼如下:
funcs = [lambda x, n = n: x+n for n in range(3)] for f in funcs:print(f(0))# 0 # 1 # 2
?
轉(zhuǎn)載于:https://www.cnblogs.com/a-ant/p/11030145.html
總結(jié)
以上是生活随笔為你收集整理的(二十)python 3 匿名函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 倩女幽魂手游异人技能每级加多少修为
- 下一篇: 听说如何设置悬浮窗