系列 · Python 零基础到简单脚本 第 11 篇 / 共 11 篇 教程

Python 综合考核:20 题检查运行轨迹、错误定位与完整脚本

用 20 道题检查 Python 入门能力:预测输出、填写状态变化、完成基础代码、定位具体异常,并复用 A001/A002/A003 完成订单脚本任务。

作者:黄撑 更新于 2026-08-27
本文目录 27 节 · 点击展开

这不是一张只检查语法记忆的试卷。20 道题会反复要求你画出或填写 输入、当前行、状态变化、输出 / 异常,看自己能不能沿着 Python 的运行轨迹解释结果。

综合验收面板先写轨迹,再运行验证
20
道正式题
≥ 4
道状态追踪
≥ 4
道错误定位
0
个第三方库

怎么完成这套题

建议先下载配套练习文件,在代码注释下作答;遇到预测题时,先不要运行。

状态题和错误题都按下面的格式回答。只有最终输出,没有中间轨迹,不算完整作答。

两种必须看得见的答案格式
状态题输入 → 当前行 → 变量变化 → 输出
错误题输入 → 出错行 → 异常类型 → 后续去向

第一组:预测输出与状态变化

01—05沿着每一行填写变量状态

01|字符串怎样变成库存数字

不运行代码,填写 raw_stockstock 的值与类型,并写出最终输出。

raw_stock = "3"
stock = int(raw_stock)
print(stock < 5)

请按轨迹填写:

"3" → int(...) → stock = ?(类型:?)→ stock < 5 → ?

02|沿列表和字典找到订单状态

orders = [
    {"order_no": "A001", "status": "已支付"},
    {"order_no": "A002", "status": "已退款"},
]

print(orders[0]["status"])

写出访问路径和输出,并说明 [0]["status"] 分别在哪一种容器里寻找数据。

03|别名修改了哪一份数据

orders = [
    {"order_no": "A001", "status": "已支付"},
    {"order_no": "A002", "status": "已退款"},
]

alias = orders
alias[1]["status"] = "已支付"
print(orders[1]["status"])

写出 orders[1]["status"] 修改前后的值、最终输出,并解释为什么改 alias 会影响 orders

04|条件顺序决定走哪扇门

stock = 0

if stock < 5:
    result = "需要补货"
elif stock == 0:
    result = "缺货"
else:
    result = "库存正常"

print(result)

写出第一个为真的条件、实际输出,再调整条件顺序,让 stock == 0 时输出 缺货

05|三轮循环怎样累积成 2 和 328.0

orders = [
    {"order_no": "A001", "sku": "K161", "amount": 129.0, "status": "已支付"},
    {"order_no": "A002", "sku": "K162", "amount": 88.0, "status": "已退款"},
    {"order_no": "A003", "sku": "K161", "amount": 199.0, "status": "已支付"},
]

paid_count = 0
total_amount = 0.0

for order in orders:
    if order["status"] == "已支付":
        paid_count += 1
        total_amount += order["amount"]

print(paid_count, total_amount)

逐轮填写,不要只写最终答案:

轮次当前订单条件结果paid_counttotal_amount
1????
2????
3????

第二组:完成基础代码

06—12让输入经过转换、函数、文件与 JSON

06|转换库存并判断是否补货

补全代码,把字符串库存转换为整数,并输出:K161 需要补货:True

sku = "K161"
raw_stock = "3"

# 在这里补全

07|修改嵌套订单状态

只写一行代码,把 A002 的状态从 已退款 改成 已支付

orders = [
    {"order_no": "A001", "status": "已支付"},
    {"order_no": "A002", "status": "已退款"},
]

# 在这里补全
print(orders[1]["status"])

08|补全库存分类函数

函数必须按顺序处理三条路径:等于 0、小于 5、其他。

def classify_stock(stock):
    # 在这里补全
    pass


print(classify_stock(0))   # 缺货
print(classify_stock(3))   # 需要补货
print(classify_stock(10))  # 库存正常

09|筛选已支付订单并汇总

从固定三条订单中得到 paid_orderspaid_counttotal_amount。预期订单号是 A001、A003,数量是 2,总额是 328.0。

orders = [
    {"order_no": "A001", "sku": "K161", "amount": 129.0, "status": "已支付"},
    {"order_no": "A002", "sku": "K162", "amount": 88.0, "status": "已退款"},
    {"order_no": "A003", "sku": "K161", "amount": 199.0, "status": "已支付"},
]

# 在这里补全

10|用 return 交出订单金额

补全函数:单价 × 数量 × (1 - 折扣率),并让调用结果为 232.2

def calculate_order_amount(price, quantity, discount_rate):
    # 在这里补全,必须使用 return
    pass


amount = calculate_order_amount(129.0, 2, 0.1)
print(amount)

11|让汇总结果往返 JSON

使用标准库 json,先把字典转换为 JSON 字符串,再转回 Python 字典。中文不能显示成 Unicode 转义。

summary = {"paid_count": 2, "total_amount": 328.0, "status": "已完成"}

# 在这里补全 json.dumps 与 json.loads

12|读取同目录测试文件

使用 pathlib.Path 和 UTF-8 编码,读取练习文件同目录下的 test.txt。无论从哪个工作目录启动,都应该能找到它。

from pathlib import Path

# 提示:先找到当前 .py 文件所在目录,再拼接 test.txt

第三组:沿错误路径定位

13—16写出具体行号、异常类型与后续去向

13|中文数字无法转换

1  raw_stock = "三"
2  stock = int(raw_stock)
3  print(stock < 5)

写出:出错行号、异常类型、该行是否成功创建 stock,以及第 3 行是否执行。

14|文件不存在

1  from pathlib import Path
2  path = Path("missing-orders.json")
3  text = path.read_text(encoding="utf-8")
4  print(text)

写出:出错行号、异常类型,以及为什么错误发生在“读取”而不是创建 Path 对象时。

15|JSON 格式不合法

1  import json
2  text = '[{"order_no": "A001",}]'
3  orders = json.loads(text)
4  print(orders[0]["order_no"])

写出:出错行号、异常类型、第 4 行是否执行,并指出原始文本中的格式问题。

16|坏金额怎样被记录后跳过

raw_orders = [
    {"order_no": "A001", "amount": "129.0"},
    {"order_no": "A002", "amount": "未知"},
    {"order_no": "A003", "amount": "199.0"},
]

clean_orders = []
problems = []
total_amount = 0.0

for order in raw_orders:
    try:
        amount = float(order["amount"])
    except ValueError as error:
        problems.append({"order_no": order["order_no"], "error": type(error).__name__})
        continue

    clean_orders.append(order["order_no"])
    total_amount += amount

逐轮写出“转换成功 / 发生异常 / continue 后去向”,再填写最终的 clean_ordersproblemstotal_amount。还要指出发生异常的具体语句与类型。

第四组:完成订单脚本

17—20把输入、清洗、汇总、输出连成一条路径

后四题继续使用这三条固定订单:

orders = [
    {"order_no": "A001", "sku": "K161", "amount": 129.0, "status": "已支付"},
    {"order_no": "A002", "sku": "K162", "amount": 88.0, "status": "已退款"},
    {"order_no": "A003", "sku": "K161", "amount": 199.0, "status": "已支付"},
]

17|实现单条订单清洗函数

完成 normalize_order(raw_order)

  • 必须读取 order_noskuamountstatus 四个字段;缺字段时保留 KeyError
  • order_nosku 去除首尾空格并转成大写。
  • status 去除首尾空格。
  • amount 转成 float
  • 返回一条新的字典,不修改输入字典。
def normalize_order(raw_order):
    # 在这里补全
    pass

18|实现已支付汇总函数

完成 build_summary(orders),返回下面形状的字典:

{
    "paid_order_nos": ["A001", "A003"],
    "paid_count": 2,
    "total_amount": 328.0,
}

19|画出四个函数之间的数据交接

下面是完整脚本的主路径:

raw_orders = load_orders(input_path)
clean_orders = [normalize_order(order) for order in raw_orders]
summary = build_summary(clean_orders)
write_summary(output_path, summary)

为每一行填写“输入形状 → 输出形状”,并回答:

  1. 哪一步第一次得到 list[dict]
  2. 哪一步得到 paid_count = 2total_amount = 328.0
  3. 哪一步只负责把已有结果写入文件,不再重新计算?

20|让坏订单退出当前路径,而不是拖垮整批任务

把 A003 的金额改成字符串 "未知"。设计一条处理路径,使它依次经过:

normalize_order → except → problems → continue → build_summary

要求:

  • 捕获金额转换产生的具体异常,不使用空的 except
  • problems 记录订单号和异常类型。
  • A001、A002 仍继续处理。
  • 最终已支付订单只有 A001,paid_count = 1total_amount = 129.0、问题数为 1。
  • 画出 A003 从进入清洗到被跳过的状态轨迹。

选修加分题:对象有没有保存各自的状态

这道题不计入 20 题。先预测输出,再解释 self 为什么只修改当前实例。

class Product:
    def __init__(self, sku, stock):
        self.sku = sku
        self.stock = stock

    def add_stock(self, quantity):
        self.stock += quantity


product1 = Product("K161", 3)
product2 = Product("K162", 10)
product1.add_stock(5)

print(product1.stock)
print(product2.stock)

自评:不是看做对几道,而是看哪里断线

17—20 题能独立解释运行路径,可以进入真实小任务。
13—16 题主要路径已掌握,回看答错题对应章节。
9—12 题先补状态追踪与函数、文件章节,再重做。
0—8 题从第 1 章重新沿图运行代码,不急着背答案。