核心要点
知道 lambda 是单行匿名函数表达式
能举例 sorted/key、map、高阶 API
了解局限:单表达式、无语句、调试困难
标准回答
语法:lambda 参数: 表达式,表达式值即返回值,不能有 return、赋值等语句。
sorted(users, key=lambda u: u["age"])
list(map(lambda x: x * 2, nums))
button.on_click(lambda e: print("clicked"))适用场景:
- 一次性、极短逻辑作高阶函数参数
- GUI/事件回调占位
不适用:
- 多行逻辑 → 用
def - 需要 docstring、类型注解、调试栈清晰
与 def 等价:lambda x, y: x + y ≡ def _anon(x, y): return x + y
Pandas .apply(lambda row: ...) 常见但大 DataFrame 上 Python lambda 慢,优先向量化。
常见误区
⚠️ 常见踩坑
在循环里建一堆 lambda 却共用同一个闭包变量(late binding),如 '[lambda: i for i in range(3)]' 调用时全返回 2,需用 'lambda i=i: i' 立即绑定。还有人把 lambda 赋值给变量当具名函数用——PEP 8 不推荐,这样既失去匿名意义、堆栈又显示 '
追问
追问 1:lambda 能包含 if 吗?
可以用条件表达式:lambda x: x if x > 0 else 0。但不能写多行 if 块、for/while 等语句;复杂逻辑应改用 def 或生成器,可读性也更好。
追问 2:为什么 lambda 里循环变量容易出 bug?
funcs = [lambda: i for i in range(3)] 中每个 lambda 闭包引用同一个 i,调用时 i 已为 3。修复:用默认参数立即绑定当前值 lambda i=i: i,或在循环内用 def 包一层。
追问 3:operator 模块能替代哪些 lambda?
取属性/下标/做运算的简单 lambda 可换成 operator 里的函数:sorted(users, key=operator.itemgetter("age")) 替 lambda u: u["age"],attrgetter("name") 替 lambda o: o.name,operator.add 替 lambda a,b: a+b。它们用 C 实现,更快也更易读,配合 functools.reduce / sorted 很常见。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📖 术语表
📰 AI 资讯