logo
26

推导式

⏱️ 25分钟

推导式(Comprehensions):把常见循环写得更简洁

你现在可能会困惑什么

“推导式是不是必须会,不会就不 Pythonic?”

不是。推导式是可读性工具,不是炫技工具。 先保证你能读懂和维护。

一句话定义

推导式是“循环 + 条件 + 生成新集合”的简洁写法。

生活类比

普通循环像手工装配; 推导式像流水线模板,规则固定时效率更高。

最小可运行例子

squares = [x * x for x in range(1, 6)]
print(squares)

三种高频推导式

# list
list_even = [x for x in range(1, 11) if x % 2 == 0]

# dict
scores = {"Amy": 88, "Bob": 95, "Cara": 76}
passed = {name: s for name, s in scores.items() if s >= 80}

# set
vals = [1, 1, 2, 3, 3]
unique_sq = {x * x for x in vals}

何时不用推导式

  • 逻辑超过一层且难读
  • 需要复杂异常处理
  • 需要多段中间状态调试

课堂小测(5 分钟)

  1. 生成 1~100 中能被 3 整除的列表。
  2. ['alice', 'bob'] 转成 {name: len(name)}
  3. 用 set 推导式完成去重后平方。

课堂小测参考答案与判分点

  • 参考答案方向:能写出可运行代码,并覆盖题目中的核心条件与边界输入。
  • 判分点 1(正确性):主流程结果正确,关键分支可执行。
  • 判分点 2(可读性):变量命名清晰,结构不过度嵌套。
  • 判分点 3(健壮性):对空值、类型错误或异常输入有基础保护。

迁移任务(课后)

把一个“普通循环清洗用户列表”的代码改成推导式版本,并比较可读性。

本节验收标准

你能独立做到:

  • 写出 list/dict/set 推导式
  • 判断何时用推导式、何时用普通循环
  • 保持代码简洁且可读

常见报错与调试步骤(新手版)

  • 报错看不懂:先读最后一行错误类型(如 TypeErrorNameError),再回到对应代码行定位。
  • 不确定变量值:在关键位置临时 print(变量, type(变量)),先确认数据是否符合预期。
  • 改了代码却没生效:确认文件已保存、运行的是当前文件、终端环境(venv)是否正确。

常见误区

  • 误区:所有循环都改推导式才专业。

  • 正解:复杂逻辑强行压缩会降低可维护性。

  • 误区:一行塞太多条件。

  • 正解:可读性下降就拆开写。