3.1 条件与循环
前置:2.2 · 约 30 分钟 · 官方对应:更多控制流工具 · 核对日期 2026-10-06
目标
- 读懂
if/elif/else与条件表达式a if 条件 else b。 - 用
for遍历任意可迭代对象,熟练使用range、enumerate、zip。 - 理解
break、continue与循环的else子句(minimal_agent.py主循环的关键)。 - 能读懂
match语句(3.10 起)。
核心概念
if / elif / else
Python · 可运行
python
def classify(stop_reason):
if stop_reason == "tool_use":
return "需要执行工具"
elif stop_reason in ("end_turn", "stop_sequence"):
return "已给出回答"
else:
return f"其他:{stop_reason}"
for r in ["tool_use", "end_turn", "max_tokens"]:
print(r, "→", classify(r))条件表达式(三元运算)写在一行内:值1 if 条件 else 值2。
Python · 可运行
python
n = 3
print("偶数" if n % 2 == 0 else "奇数")for:遍历可迭代对象
Python 的 for 是“for-each”:依次取出可迭代对象(列表、字符串、字典、range……)的每个元素。没有 C 风格的 for (i = 0; i < n; i++)。
Python · 可运行
python
for turn in range(1, 6): # range(start, stop[, step]):含 start,不含 stop
print(turn, end=" ")
print()
print(list(range(5)), list(range(0, 10, 3)))
cities = ["北京", "上海"]
for i, city in enumerate(cities, start=1): # 同时拿到序号和元素
print(i, city)
temps = [18, 22]
for city, t in zip(cities, temps): # 并行遍历多个序列
print(f"{city} {t}°C")while、break、continue
Python · 可运行
python
n = 0
while True:
n += 1
if n % 2 == 0:
continue # 跳过本次剩余部分,进入下一次
if n > 7:
break # 立即结束整个循环
print(n, end=" ")循环的 else 子句
for / while 可以带 else:循环没有被 break 打断、正常结束时执行 else。它适合“在循环里找东西,找到就 break,找不到再处理”的模式。
Python · 可运行
python
def find_first_even(numbers):
for n in numbers:
if n % 2 == 0:
print("找到", n)
break
else:
print("没有偶数") # 只有循环跑完都没 break 才会执行
find_first_even([1, 3, 4, 5])
find_first_even([1, 3, 5])pass 与 match
pass 是占位语句,什么都不做。match(PEP 636,3.10 起)按结构匹配,读码时常见于解析消息:
Python · 可运行
python
def describe(block):
match block:
case {"type": "text", "text": text}:
return f"文本:{text}"
case {"type": "tool_use", "name": name}:
return f"调用工具:{name}"
case _:
return "未知块"
print(describe({"type": "text", "text": "你好"}))
print(describe({"type": "tool_use", "name": "get_weather", "input": {}}))
print(describe({"type": "thinking"}))字典模式只要求列出的键存在,多余的键会被忽略;case _ 匹配任何值。
易错点
range(1, 5)不含 5:要 1 到 N(含)写range(1, N + 1)。- 循环
else不是“循环为空时执行”:只要没被break,循环体执行 0 次或多次后都会执行else。 - 遍历时修改同一个列表:会跳过元素;应遍历副本
for x in items[:]或构造新列表。 =与==:if x = 1:是语法错误;需要“赋值并判断”时用海象运算符:=(3.8 起),如while (line := f.readline()):。
Python · 可运行
python
items = [1, 2, 2, 3]
for x in items: # 错误示范:边遍历边删除
if x == 2:
items.remove(x)
print(items) # [1, 2, 3],漏删了一个 2
items = [1, 2, 2, 3]
print([x for x in items if x != 2]) # 正确:构造新列表对照
| 写法 | Python | JS | Java |
|---|---|---|---|
| 条件表达式 | a if c else b | c ? a : b | c ? a : b |
| 计数循环 | for i in range(n) | for (let i = 0; i < n; i++) | for (int i = 0; i < n; i++) |
| 遍历元素 | for x in xs | for (const x of xs) | for (var x : xs) |
| 带下标 | for i, x in enumerate(xs) | xs.forEach((x, i) => …) | 手动计数 |
| else if | elif | else if | else if |
| 循环 else | 有 | 无 | 无 |
| switch | match(结构匹配) | switch | switch(含模式匹配) |
读代码
minimal_agent.py 的主循环骨架:
python
for turn in range(1, MAX_TURNS + 1): # turn = 1, 2, 3, 4, 5
resp = client.messages.create(...)
messages.append(...)
if resp.stop_reason != "tool_use": # 模型给出最终回答
...
break # 跳出 for,else 不执行
... # 执行工具,进入下一轮
else:
print(f"超过最大轮数 {MAX_TURNS},仍未得到最终回答")else与for对齐,属于for而不是if。- 只有 5 轮都请求工具(从未
break)时,才打印“超过最大轮数”。这是循环else的典型用途:用 break 表示成功,用 else 表示穷尽。
练习
练习 1:模拟 Agent 主循环
replies 是模型每轮返回的 stop_reason 序列。实现 run_loop(replies, max_turns):从第 1 轮开始依次读取,遇到不是 "tool_use" 的值就返回 f"第 {turn} 轮结束";如果 max_turns 轮内都是 "tool_use"(或 replies 不够长),返回 "超过最大轮数"。请使用 for … else。
练习
def run_loop(replies, max_turns):
for turn in range(1, max_turns + 1):
...
快捷键:⌘/Ctrl + Enter 提交检查
练习 2:编号输出
实现 numbered(items):返回形如 ["1. 北京", "2. 上海"] 的列表。使用 enumerate。
练习
def numbered(items):
result = []
return result
快捷键:⌘/Ctrl + Enter 提交检查
小结
for遍历可迭代对象;range不含终点;enumerate、zip是常用搭档。break跳出循环,continue跳过本次;循环else在“没被 break”时执行。match用于结构匹配,读码时把每个case看成一种数据形状。