Skip to content

条件、循环与推导式 ​

学习目标 ​

  • 使用 if、for、while 表达程序流程。
  • 掌握 break、continue、else 和模式匹配的边界。
  • 用列表、字典、集合推导式写出清晰的数据转换。

核心知识点 ​

条件语句根据真值选择分支,循环消费可迭代对象。for 不依赖下标,通常比 while 更安全;推导式是带过滤条件的数据构造语法,不应隐藏复杂副作用。

常用用法 ​

if / elif / else ​

python
score = 86
if score >= 90:
    level = "A"
elif score >= 60:
    level = "B"
else:
    level = "C"
print(level)
# 输出:B

分支条件按顺序判断,首个为真的分支执行后即结束。

真值判断 ​

python
values = [[], [1], "", "ok", 0, 1, None]
truthy = [value for value in values if value]
print(truthy)
# 输出:[[1], 'ok', 1]

空容器、空字符串、0 和 None 通常为假;需要区分“空”和“缺失”时不要只写 if value。

for 与 range ​

python
total = 0
for number in range(1, 5):
    total += number
print(total)
# 输出:10

range 是惰性可迭代对象,区间右端不包含;复杂遍历优先直接遍历元素。

enumerate() ​

python
names = ["Ada", "Lin"]
indexed = [f"{index}:{name}" for index, name in enumerate(names, start=1)]
print(indexed)
# 输出:['1:Ada', '2:Lin']

需要序号时用 enumerate,不要维护容易错位的手工计数器。

zip() ​

python
names = ["Ada", "Lin"]
scores = [98, 91]
paired = list(zip(names, scores))
print(paired)
# 输出:[('Ada', 98), ('Lin', 91)]

zip 默认按较短序列结束;需要检查长度时可使用 strict=True(Python 3.10+)。

while 与 break ​

python
number = 1
seen = []
while number <= 5:
    if number == 4:
        break
    seen.append(number)
    number += 1
print(seen)
# 输出:[1, 2, 3]

while 必须确保循环状态最终变化,否则会无限循环。

continue ​

python
values = [1, 2, 3, 4]
odds = []
for value in values:
    if value % 2 == 0:
        continue
    odds.append(value)
print(odds)
# 输出:[1, 3]

continue 跳过本次循环剩余代码,复杂嵌套时可改写成过滤表达式。

列表推导式 ​

python
squares = [number * number for number in range(5) if number % 2 == 0]
print(squares)
# 输出:[0, 4, 16]

推导式适合“一进一出”的转换;多重嵌套或副作用应写普通循环。

不常用但需要知道 ​

循环 else ​

python
target = 7
for value in [1, 3, 5]:
    if value == target:
        print("找到")
        # 输出:找到
        break
else:
    print("未找到")
    # 输出:未找到

循环 else 在循环自然结束、没有执行 break 时运行,适合表达“搜索失败”。

match / case ​

python
# 代码片段:Python 3.10+;完整文件请使用 Python 3.11+
command = "start"
match command:
    case "start":
        result = "启动"
    case "stop":
        result = "停止"
    case _:
        result = "未知"
print(result)
# 输出:启动

结构化模式匹配适合多个固定形状分支;简单真假判断仍用 if。

集合与字典推导式 ​

python
unique = {number % 3 for number in range(6)}
mapping = {number: number * number for number in range(3)}
print(sorted(unique), mapping)
# 输出:[0, 1, 2] {0: 0, 1: 1, 2: 4}

推导式中的键重复时,字典保留最后一次值。

易混点 ​

  • range(stop) 不包含 stop。
  • zip 返回迭代器,消费一次后不能再次从头遍历。
  • break 只退出最近一层循环,continue 只跳过本次。
  • and/or 是短路求值且返回操作数;条件表达式才是 a if c else b。
  • 推导式变量在 Python 3 中有自己的作用域,不会泄漏到外层。

课后小问 ​

  1. 如何在列表中同时拿到下标和元素? 答案:使用 enumerate(items, start=...)。 解析:它直接产生 (index, value) 对,避免 range(len(items)) 的下标访问。

  2. for ... else 中的 else 什么时候执行? 答案:循环自然结束且没有遇到 break 时执行。 解析:else 不是“最后一次循环”的意思,而是搜索未提前终止的分支。

本节小结 ​

直接遍历、enumerate、zip 和短小推导式覆盖绝大多数流程代码;while 用于条件未知的循环,match 用于结构化分支。

快速回顾 ​

  • 分支:if / elif / else
  • 遍历:for、range、enumerate、zip
  • 控制:break、continue
  • 转换:列表/集合/字典推导式
  • 搜索语义:循环 else