參考地址:
https://realpython.com/python-lambda/
py 的lambda 對他食零,有愛有恨
因為加過很多次了,但是有時候就是想不起來用它,為毛呢,因為老是怕程序出錯,還是了解的不徹底翱捣摺?今天詳細講講 這個吧舶吗!
我使用 lambda ,不是為了裝逼征冷,而是逐漸練出那種 符合 pannic 風格的代碼,減少冗余代碼誓琼,這是個目標(因為lambda 在一些 內置函數检激,或者第三方包里面經畴茸剑看到)
lambda 是 py 最小的函數單元,精簡叔收,但語法更嚴格
Java齿穗,C#甚至C ++ 都有l(wèi)ambda ,py 也不例外。666饺律,看來是有大用處的咯
pass
格式 lambda 變量: 語句
幾種書寫方式 :
1 lambda x: x + 1
2 (lambda x: x + 1)(2) # 匿名函數直接執(zhí)行的情況
lambda 是個函數對象窃页,因此可以賦值給一個變量,如:
a = lambda x: x*2
a(2) => 4
注意 lambda的參數不需要用 () 只需要 用 复濒,
分割一下就好
使用場景:
1 脖卖、比較剪短的函數體
2 、和高階函數一起使用
比如你的 lambda 中有調用其他的函數巧颈,或者是另外一個 lambda 表達式
更常見的是 配置內置額 的 高階函數比如 :
map filter (這個確實 很常見)
lambda 和普通函數的差別
函數名稱對象名不一樣
lambda 函數名 是 lambda對象
>>> import dis
>>> add = lambda x, y: x + y
>>> type(add)
<class 'function'>
>>> dis.dis(add)
1 0 LOAD_FAST 0 (x)
2 LOAD_FAST 1 (y)
4 BINARY_ADD
6 RETURN_VALUE
>>> add
<function <lambda> at 0x7f30c6ce9ea0>
普通函數是 他自己
>>> def add(x, y): return x + y
>>> type(add)
<class 'function'>
>>> dis.dis(add)
1 0 LOAD_FAST 0 (x)
2 LOAD_FAST 1 (y)
4 BINARY_ADD
6 RETURN_VALUE
>>> add
<function add at 0x7f30c6ce9f28>
現在函數是 add 而不是上面的 <lambda>
報錯堆棧不一樣
lambda 如果報錯畦木,只會說出 <lambda>
普通函數則會爆出 出錯的函數名
(其實和第一條是一樣的)
lambda
>>> div_zero = lambda x: x / 0
>>> div_zero(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <lambda>
ZeroDivisionError: division by zero
普通函數
>>> def div_zero(x): return x / 0
>>> div_zero(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in div_zero
ZeroDivisionError: division by zero
內容上的區(qū)別
1 只能包含一個表達式,不能寫語句 (return洛二,pass馋劈,assert都不能有)
2 不支持類型注釋
3 可以立即執(zhí)行
不能寫語句
例如:
>>> (lambda x: assert x == 2)(2)
File "<input>", line 1
(lambda x: assert x == 2)(2)
^
SyntaxError: invalid syntax
單個表達式
總之你不能寫幾行的那種函數
lambda 參數
支持和普通函數一樣的參數傳遞方式:
>>> (lambda x, y, z: x + y + z)(1, 2, 3)
6
>>> (lambda x, y, z=3: x + y + z)(1, 2)
6
>>> (lambda x, y, z=3: x + y + z)(1, y=2)
6
>>> (lambda *args: sum(args))(1,2,3)
6
>>> (lambda **kwargs: sum(kwargs.values()))(one=1, two=2, three=3)
6
>>> (lambda x, *, y=0, z=0: x + y + z)(1, y=2, z=3)
6
幾個常見的鼓勵使用 lambda 的例子
1 攻锰、lambda函數經常和內置函數map()
和filter()
晾嘶,以及functools.reduce()
一起使用
>>> list(map(lambda x: x.upper(), ['cat', 'dog', 'cow']))
['CAT', 'DOG', 'COW']
>>> list(filter(lambda x: 'o' in x, ['cat', 'dog', 'cow']))
['dog', 'cow']
>>> from functools import reduce
>>> reduce(lambda acc, x: f'{acc} | {x}', ['cat', 'dog', 'cow'])
'cat | dog | cow'
2、 UI框架中使用 lambda函數來映射響應UI事件的動作
button = tk.Button(
window,
text="Reverse",
command=lambda: label.configure(text=label.cget("text")[::-1]),
)