Python 進階:Lambda 匿名函數
作者:老朱2000
Lambda 函數(又稱匿名函數)是 Python 中一種簡潔的定義單行函數的方式,適用于簡單邏輯的場景。
Lambda 函數(又稱匿名函數)是 Python 中一種簡潔的定義單行函數的方式,適用于簡單邏輯的場景。
匿名函數是指沒有使用 def 語句定義的函數。它的定義語法是:
lambda 參數列表: 表達式
- 無參數:lambda: 返回值
- 單參數:lambda x: x * 2
- 多參數:lambda x, y: x + y
- 默認參數:lambda x, y=10: x + y
- 可變參數:lambda *args: sum(args)
特點:
- 匿名函數(無函數名)
- 只能包含一個表達式(不能寫 return)
- 自動返回表達式結果
1. 使用場景
(1) 配合高階函數使用
當需要一個一次性使用的簡單函數來進行計算時,lambda 函數非常方便。
# map:對每個元素平方
numbers = [1, 2, 3]
squared = list(map(lambda x: x**2, numbers))
# [1, 4, 9]
# filter:篩選偶數
evens = list(filter(lambda x: x % 2 == 0, numbers))
# [2]
# sorted:按字符串長度排序
words = ["apple", "kiwi", "banana"]
sorted_words = sorted(words, key=lambda s: len(s))
# ['kiwi', 'apple', 'banana']
(2) 作為函數參數
# 自定義排序(按元組第二項)
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. 注意事項
(1) 避免過度復雜
Lambda 應保持簡單,復雜邏輯用 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) 作用域問題
在循環中創建 lambda 時,注意變量捕獲:
# 錯誤示例(所有函數都返回 9)
funcs = [lambda: i for i in range(10)]
print(funcs[0]()) # 輸出 9(i 的最終值)
# 正確做法:使用默認參數凍結當前值
funcs = [lambda i=i: i for i in range(10)]
print(funcs[0]()) # 輸出 0
(3) 不能包含語句
禁止使用 if(條件表達式 x if cond else y 除外)、for、while 等語句。
3. 總結
- 適用場景:簡單邏輯、一次性的小型函數(如排序鍵、映射轉換)。
- 優勢:代碼簡潔,無需命名。
- 限制:不支持多行邏輯或復雜控制流。
最佳實踐:
- 與 map()、filter()、sorted() 配合使用
- 作為高階函數的參數
- 避免替代復雜的命名函數
責任編輯:趙寧寧
來源:
程序員老朱