Python 進(jìn)階:Lambda 匿名函數(shù)
Lambda 函數(shù)(又稱匿名函數(shù))是 Python 中一種簡(jiǎn)潔的定義單行函數(shù)的方式,適用于簡(jiǎn)單邏輯的場(chǎng)景。
匿名函數(shù)是指沒(méi)有使用 def 語(yǔ)句定義的函數(shù)。它的定義語(yǔ)法是:
lambda 參數(shù)列表: 表達(dá)式
- 無(wú)參數(shù):lambda: 返回值
- 單參數(shù):lambda x: x * 2
- 多參數(shù):lambda x, y: x + y
- 默認(rèn)參數(shù):lambda x, y=10: x + y
- 可變參數(shù):lambda *args: sum(args)
特點(diǎn):
- 匿名函數(shù)(無(wú)函數(shù)名)
- 只能包含一個(gè)表達(dá)式(不能寫(xiě) return)
- 自動(dòng)返回表達(dá)式結(jié)果
1. 使用場(chǎng)景
(1) 配合高階函數(shù)使用
當(dāng)需要一個(gè)一次性使用的簡(jiǎn)單函數(shù)來(lái)進(jìn)行計(jì)算時(shí),lambda 函數(shù)非常方便。
# map:對(duì)每個(gè)元素平方
numbers = [1, 2, 3]
squared = list(map(lambda x: x**2, numbers))
# [1, 4, 9]
# filter:篩選偶數(shù)
evens = list(filter(lambda x: x % 2 == 0, numbers))
# [2]
# sorted:按字符串長(zhǎng)度排序
words = ["apple", "kiwi", "banana"]
sorted_words = sorted(words, key=lambda s: len(s))
# ['kiwi', 'apple', 'banana']
(2) 作為函數(shù)參數(shù)
# 自定義排序(按元組第二項(xiàng))
pairs = [(1, 9), (2, 5), (3, 7)]
pairs.sort(key=lambda pair: pair[1])
# [(2, 5), (3, 7), (1, 9)]
# 在閉包中使用
def multiplier(n):
return lambda x: x * n
double = multiplier(2)
print(double(5))
# 10
2. 注意事項(xiàng)
(1) 避免過(guò)度復(fù)雜
Lambda 應(yīng)保持簡(jiǎn)單,復(fù)雜邏輯用 def 定義
# 不推薦(可讀性差)
result = (lambda x: x**2 if x > 0 else 0)(5)
# 推薦使用 def
def square_if_positive(x):
return x**2 if x > 0 else 0
(2) 作用域問(wèn)題
在循環(huán)中創(chuàng)建 lambda 時(shí),注意變量捕獲:
# 錯(cuò)誤示例(所有函數(shù)都返回 9)
funcs = [lambda: i for i in range(10)]
print(funcs[0]()) # 輸出 9(i 的最終值)
# 正確做法:使用默認(rèn)參數(shù)凍結(jié)當(dāng)前值
funcs = [lambda i=i: i for i in range(10)]
print(funcs[0]()) # 輸出 0
(3) 不能包含語(yǔ)句
禁止使用 if(條件表達(dá)式 x if cond else y 除外)、for、while 等語(yǔ)句。
3. 總結(jié)
- 適用場(chǎng)景:簡(jiǎn)單邏輯、一次性的小型函數(shù)(如排序鍵、映射轉(zhuǎn)換)。
- 優(yōu)勢(shì):代碼簡(jiǎn)潔,無(wú)需命名。
- 限制:不支持多行邏輯或復(fù)雜控制流。
最佳實(shí)踐:
- 與 map()、filter()、sorted() 配合使用
- 作為高階函數(shù)的參數(shù)
- 避免替代復(fù)雜的命名函數(shù)