三天阶段测验答案(默认折叠)¶
闭卷做完、自己判完再看
每次只展开当天那一组。答案里的输出都在 Python 3.14.4 上实际运行核对过。
点击展开:Day 2 晨测(Day 1 内容)
Day 2 晨测(Day 1 内容)¶
3 -4 1 8 2.0——//向下取整所以-7 // 2是-4;/永远得 float。bcd ef fedcba ace- 打印
[1, 2, 3, 4]。b = a只是给同一个列表多起了一个名字(别名),不是复制;通过b修改就是修改a。 - 打印
None。list.sort()原地排序、返回None。改法:x = sorted([3, 1, 2]),或先x = [3, 1, 2]再x.sort()。 - 参考:
- 可变默认参数:
lst=[]只在函数定义时创建一次,之后每次调用都共用同一个列表,第二次调用会看到第一次的数据。改法:lst=None,函数体里if lst is None: lst = []。 None 0 True 13.14| 42|07(42前面 3 个空格:宽度 5 右对齐)UnboundLocalError(它是NameError的子类)。函数体里有total = ...赋值,Python 就把total当作局部变量,而右边的total + n在赋值前读取了它。改法:不用全局变量,把total作为参数传入并返回新值;(不推荐)或在函数开头写global total。TypeError:类型不对("3" + 1、给函数传错类型的参数);ValueError:类型对但值不合法(int("abc"));IndexError:序列下标越界(列表/字符串/元组);KeyError:字典里没有这个键。
点击展开:Day 3 联合晨测(Day 1 + Day 2)
Day 3 联合晨测(Day 1 + Day 2)¶
[2, 4, 6] 14(1²+2²+3²)[('c', 1), ('b', 2), ('a', 2)]—— 按第二项排序;("b", 2)与("a", 2)相等,稳定排序保持原顺序,所以b在a前。- 先打印两次
done(每次调用都执行finally),最后打印7 -1。注意finally在return之后、真正返回之前执行。 - 可能报
UnicodeDecodeError: 'gbk' codec can't decode byte ...,因为 Windows 中文系统上 Python 3.14 的默认编码是系统代码页 GBK。正确写法:with open("a.txt", encoding="utf-8") as f: text = f.read()(或Path("a.txt").read_text(encoding="utf-8"))。Python 3.15(2026-10-01 发布)起默认 UTF-8(PEP 686),但显式写编码永远不会错。 - 参考:
- 参考:
不能写
from dataclasses import dataclass, field @dataclass class Book: title: str tags: list[str] = field(default_factory=list)tags: list[str] = []:dataclass 会直接报ValueError: mutable default ... use default_factory;原因和可变默认参数一样——所有实例会共享同一个列表。 super().__init__(...)(把父类需要的参数传进去)。- 参考:
1 [2] []—— 生成器只能遍历一次:next取走 1,list取走剩下的 2,再list已经耗尽。- 参考:
点击展开:三天结业测验(笔答要点 + 限时编码参考答案)
结业测验¶
笔答要点¶
- 别名:两个名字指向同一个列表对象,改一个另一个也变。需要独立副本(例如要保留原数据、或函数不应修改入参)时用
lst.copy()/lst[:];嵌套列表要copy.deepcopy。 with open(path, encoding="utf-8") as f: lines = [line.rstrip("\n") for line in f](或f.read().splitlines())。- 返回结果。返回值可以被测试直接断言、被其他函数复用;
print出去的东西测试抓不到、也没法再计算。把"算"和"显示"分开是可测试性的核心。 try:正常执行的代码;except:try里抛出对应异常时执行;else:try没有抛异常时执行;finally:无论如何最后都执行(包括return之后),用于清理。{w: len(w) for w in ["a", "bb", "ccc"]}- 任意 3 个,例如:
json(存档)、pathlib(路径与读写)、csv(表格)、random(随机)、datetime(日期)、statistics(统计)、dataclasses(数据类)、collections(Counter/defaultdict)。 __init__、__repr__、__eq__(默认还有比较相关的可选项,答出这三个即满分)。- 当文件被直接运行时
__name__是"__main__",被import时是模块名。测试文件import你的模块是为了拿到函数,如果没有这个判断,import时会把main()跑起来(弹出菜单、读键盘),测试就卡住了。
限时编码参考答案¶
def summarize_orders(orders: list[dict]) -> dict[str, float]:
"""按商品汇总金额;数量或单价为负数时抛 ValueError。"""
totals: dict[str, float] = {}
for order in orders:
price, qty = order["price"], order["qty"]
if price < 0 or qty < 0:
raise ValueError(f"非法订单:{order}")
totals[order["item"]] = totals.get(order["item"], 0.0) + price * qty
return totals
assert summarize_orders([]) == {}
assert summarize_orders(
[{"item": "笔", "price": 2.5, "qty": 4}, {"item": "本", "price": 5, "qty": 2}]
) == {"笔": 10.0, "本": 10.0}
assert summarize_orders(
[{"item": "笔", "price": 1, "qty": 1}, {"item": "笔", "price": 1, "qty": 2}]
) == {"笔": 3.0}
try:
summarize_orders([{"item": "x", "price": -1, "qty": 1}])
except ValueError:
pass
else:
raise AssertionError("应抛出 ValueError")
print("[OK] summarize_orders")
评分要点:15 分钟内写出并跑通前三条断言 = 达标;能想到并处理负数校验 = 优秀;写成 for + get 计数模式或用 defaultdict(float) 都可以。