Python 综合考核:20 题检查运行轨迹、错误定位与完整脚本
用 20 道题检查 Python 入门能力:预测输出、填写状态变化、完成基础代码、定位具体异常,并复用 A001/A002/A003 完成订单脚本任务。
本文目录 27 节 · 点击展开
这不是一张只检查语法记忆的试卷。20 道题会反复要求你画出或填写 输入、当前行、状态变化、输出 / 异常,看自己能不能沿着 Python 的运行轨迹解释结果。
- 20
- 道正式题
- ≥ 4
- 道状态追踪
- ≥ 4
- 道错误定位
- 0
- 个第三方库
怎么完成这套题
建议先下载配套练习文件,在代码注释下作答;遇到预测题时,先不要运行。
状态题和错误题都按下面的格式回答。只有最终输出,没有中间轨迹,不算完整作答。
输入 → 当前行 → 变量变化 → 输出输入 → 出错行 → 异常类型 → 后续去向第一组:预测输出与状态变化
01—05沿着每一行填写变量状态
01|字符串怎样变成库存数字
不运行代码,填写 raw_stock、stock 的值与类型,并写出最终输出。
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_count | total_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_orders、paid_count 和 total_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.loads12|读取同目录测试文件
使用 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_orders、problems 和 total_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_no、sku、amount、status四个字段;缺字段时保留KeyError。 order_no、sku去除首尾空格并转成大写。status去除首尾空格。amount转成float。- 返回一条新的字典,不修改输入字典。
def normalize_order(raw_order):
# 在这里补全
pass18|实现已支付汇总函数
完成 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)为每一行填写“输入形状 → 输出形状”,并回答:
- 哪一步第一次得到
list[dict]? - 哪一步得到
paid_count = 2和total_amount = 328.0? - 哪一步只负责把已有结果写入文件,不再重新计算?
20|让坏订单退出当前路径,而不是拖垮整批任务
把 A003 的金额改成字符串 "未知"。设计一条处理路径,使它依次经过:
normalize_order → except → problems → continue → build_summary要求:
- 捕获金额转换产生的具体异常,不使用空的
except。 problems记录订单号和异常类型。- A001、A002 仍继续处理。
- 最终已支付订单只有 A001,
paid_count = 1、total_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)