Administrator
Administrator
发布于 2026-10-31 / 0 阅读
0
0

Python 从入门到初级(07):循环与推导式:筛选订单并统计金额

本篇是《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 的数量。

完成后应能解释每个分支对“当前这项”和“整个循环”分别产生了什么影响。


上一篇:字典与嵌套数据:描述商品和服务器档案 · 系列目录 · 下一篇:函数:把订单计算变成可复用步骤


评论