核心要点

  • 知道 lambda 是单行匿名函数表达式

  • 能举例 sorted/key、map、高阶 API

  • 了解局限:单表达式、无语句、调试困难

标准回答

语法lambda 参数: 表达式,表达式值即返回值,不能有 return、赋值等语句。

python
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 + ydef _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 不推荐,这样既失去匿名意义、堆栈又显示 '' 难调试,该用 def。

追问

追问 1lambda 能包含 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 包一层。

追问 3operator 模块能替代哪些 lambda?

取属性/下标/做运算的简单 lambda 可换成 operator 里的函数:sorted(users, key=operator.itemgetter("age"))lambda u: u["age"]attrgetter("name")lambda o: o.nameoperator.addlambda a,b: a+b。它们用 C 实现,更快也更易读,配合 functools.reduce / sorted 很常见。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。