Python 中的 ?lambda 表達式?是一種簡潔的匿名函數,適合快速定義簡單邏輯的函數。它常用于需要函數作為參數的場景,如高階函數、排序、過濾等。以下是 lambda 的典型應用場景及示例:
1. ?基本語法?
lambda 參數1, 參數2, ... : 表達式
特點?:沒有函數名,只能包含單個表達式,自動返回表達式結果。
對比普通函數?:lambda x: x*2 等價于:
def double(x):return x * 2
2. ?應用場景?
場景 1:作為高階函數的參數?
當需要傳遞一個簡單函數到 map(), filter(), reduce() 等函數時,lambda 非常便捷:
# 示例 1:對列表元素平方
nums = [1, 2, 3]
squared = list(map(lambda x: x**2, nums)) ?# [1, 4, 9]
# 示例 2:過濾偶數
evens = list(filter(lambda x: x % 2 == 0, nums)) ?#?
# 示例 3:計算乘積(需導入 functools.reduce)
from functools import reduce
product = reduce(lambda a, b: a * b, nums) ?# 6
場景 2:自定義排序規則?
在 sorted() 或 list.sort() 中指定排序依據:
# 按字符串長度排序
words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x)) ?# ['date', 'apple', 'banana', 'cherry']
# 按元組的第二個元素排序
pairs = [(1, 3), (4, 2), (5, 1)]
sorted_pairs = sorted(pairs, key=lambda x: x) ?# [(5, 1), (4, 2), (1, 3)]
?場景 3:快速定義回調函數?
在 GUI 或事件驅動編程中簡化代碼:
# 示例:按鈕點擊事件(偽代碼)
button.on_click(lambda event: print("Button clicked!"))
?場景 4:字典排序或默認值?
在復雜數據結構中動態生成鍵或值:
# 按字典的值排序
data = {"a": 3, "b": 1, "c": 2}
sorted_items = sorted(data.items(), key=lambda item: item) ?# [('b', 1), ('c', 2), ('a', 3)]
# 使用 defaultdict 設置默認值(值為 lambda 生成的列表)
from collections import defaultdict
d = defaultdict(lambda: ["默認值"])
?3. ?注意事項?
- 適用場景?:僅適合簡單邏輯,復雜邏輯應使用 def 定義函數。
- 可讀性?:避免過度嵌套或過長的 lambda,否則會降低代碼可讀性。
- 變量捕獲?:在循環中創建 lambda 時需注意變量作用域問題:
# 錯誤示例:所有 lambda 會捕獲最終的 i 值
funcs = [lambda: i for i in range(3)]
print([f() for f in funcs]) ?# 輸出 [2, 2, 2]
?# 修復方法:通過默認參數綁定當前值
funcs = [lambda x=i: x for i in range(3)]
print([f() for f in funcs]) ?# 輸出 [0, 1, 2]
4. ?總結?
使用 lambda 的場景?:
- 需要臨時定義簡單函數(如排序、映射、過濾)。
- 函數邏輯僅包含單個表達式。
- 代碼簡潔性優先時(如回調函數)。
避免濫用?:復雜邏輯或需要復用代碼時,優先使用 def 定義命名函數。