本篇是《Python 从入门到初级》第 7 / 20 篇。示例使用 Python 3.12 兼容语法,完整目录结构与数据见配套源码包。
如果有三笔订单,可以手动写三次计算;如果有三千笔,程序应重复执行相同规则。本篇用订单筛选学习 for、while、continue、break 和简单推导式。

1. for 是逐个取出元素
names = ["小林", "小周", "小陈"]
for name in names:
print("你好,", name)
每次循环,name 绑定当前元素,缩进中的语句执行一次。列表、字符串和字典都可迭代,不一定非要先生成数字索引。
需要序号时使用 enumerate();需要连续数字时可用 range()。range(3) 对应 0、1、2,右边界不包含。
2. 完整示例:只统计已支付订单
保存为 lesson07.py:
orders = [
{"id": "A001", "amount_cents": 5900, "status": "paid"},
{"id": "A002", "amount_cents": 12500, "status": "paid"},
{"id": "A003", "amount_cents": 3900, "status": "pending"},
]
total = 0
for index, order in enumerate(orders, start=1):
if order["status"] != "paid":
continue
total += order["amount_cents"]
print(index, order["id"], order["amount_cents"])
paid_ids = [order["id"] for order in orders if order["status"] == "paid"]
print("已支付编号:", paid_ids)
print("已支付合计(分):", total)
attempt = 0
while attempt < 3:
attempt += 1
print("模拟检查次数:", attempt)
if attempt == 2:
print("模拟结果已正常,停止检查")
break
预期筛出 A001、A002,合计 18400 分。未支付订单被跳过,没有进入累计金额。模拟检查只执行两次,因为第二次满足停止条件。
这里并没有向外部服务发请求,检查次数只是用于理解循环控制。真实网络重试还需要超时、间隔和次数约束。
3. continue 和 break 的区别
continue 跳过本次循环剩余部分,进入下一项;break 结束当前这一层循环。
示例遇到非 paid 状态执行 continue,所以后面的加法不运行。while 中第二次检查后执行 break,整个 while 结束。
判断语句和循环控制的定义见 Python 控制流程教程。遇到嵌套循环时,break 只跳出最近的循环,不会自动结束整个函数或程序。
4. 累计变量为何放在循环外
total = 0 先建立初值,再在每次循环中累加。如果把它放在循环体开头,每次都会重新归零,最后只剩当前一次的数值。
这是常见的“代码能运行,结果却不对”。可以先用两条固定记录手工算一遍,再比较程序每轮的 total,找到开始偏离的位置。
遍历字典的键值对可以写:
counts = {"INFO": 3, "ERROR": 2}
for level, count in counts.items():
print(level, count)
5. 推导式只是更紧凑的构建方式
[order["id"] for order in orders if order["status"] == "paid"] 会把筛选后的编号收集成新列表。
先用普通 for 写懂,再改写成推导式。一个表达式里放很多层循环和复杂条件,虽然短,却未必好维护。
遍历列表时直接删除其中元素,可能让某些项被跳过。通常可以构建新列表,或先收集要修改的目标,而不是一边走一边改变当前迭代的结构。
6. while 要有清晰的终止条件
while 在条件为真时持续执行。如果忘记更新 attempt,条件可能一直成立。初学时尽量给它明确的次数上限,避免写下无法解释的无限循环。
练习:把 A003 的状态改成 paid,预期已支付编号变成三个,合计 22300 分。再给字典统计增加一个状态计数,分别记录 paid 和 pending 的数量。
完成后应能解释每个分支对“当前这项”和“整个循环”分别产生了什么影响。