Lambda 函数是 Python 中的匿名函数,使用 lambda
关键字定义,语法为:lambda arguments: expression
。它们通常用于需要函数对象的地方,但又不想用 def
语句定义完整函数的情况。
map()
, filter()
, reduce()
等函数配合良好# 不推荐 - 复杂逻辑用lambda
result = map(lambda x: x**2 if x % 2 == 0 else x**3, numbers)
# 推荐 - 使用命名函数
def transform(x):
return x**2 if x % 2 == 0 else x**3
result = map(transform, numbers)
# 不推荐 - 重复创建相同lambda
sorted(data, key=lambda x: x[1])
sorted(other_data, key=lambda x: x[1])
# 推荐 - 缓存lambda
key_func = lambda x: x[1]
sorted(data, key=key_func)
sorted(other_data, key=key_func)
# 不推荐
sum(map(lambda x: x*2, numbers))
# 推荐
sum(x*2 for x in numbers)
# 不推荐 - 难以阅读
lambda x: (lambda y: y**2)(x) + x
# 推荐
def outer(x):
def inner(y):
return y**2
return inner(x) + x
对于性能关键路径,命名函数通常比 lambda 更快:
import timeit
# 测试lambda性能
print(timeit.timeit('(lambda x: x+1)(5)', number=1000000))
# 测试命名函数性能
def add_one(x):
return x+1
print(timeit.timeit('add_one(5)', globals=globals(), number=1000000))
原因: Lambda 只能包含单个表达式
解决方案:
# 使用元组模拟多语句 (不推荐)
(lambda x: (print(x), x+1)[1])(5)
# 更好的方案 - 使用命名函数
def func(x):
print(x)
return x+1
func(5)
原因: Python的闭包是后期绑定
funcs = [lambda x: x+i for i in range(3)]
# 所有lambda都会使用i的最终值2
print([f(10) for f in funcs]) # 输出[12, 12, 12]而不是[10,11,12]
解决方案:
# 使用默认参数捕获当前值
funcs = [lambda x, i=i: x+i for i in range(3)]
print([f(10) for f in funcs]) # 正确输出[10,11,12]
原因: Lambda没有函数名,出错时堆栈跟踪难以阅读
解决方案:
functools.wraps
装饰器(对于高阶函数)from operator import itemgetter, attrgetter
# 替代常见lambda模式
sorted(data, key=itemgetter(1)) # 替代 lambda x: x[1]
sorted(objs, key=attrgetter('name')) # 替代 lambda x: x.name
from functools import partial
# 替代带固定参数的lambda
def power(base, exp):
return base ** exp
square = partial(power, exp=2) # 替代 lambda x: power(x, 2)
cube = partial(power, exp=3) # 替代 lambda x: power(x, 3)
通过合理使用和优化lambda表达式,可以在保持代码简洁的同时确保可读性和性能。