跳转至

三天阶段测验答案(默认折叠)

闭卷做完、自己判完再看

每次只展开当天那一组。答案里的输出都在 Python 3.14.4 上实际运行核对过。

点击展开:Day 2 晨测(Day 1 内容)

Day 2 晨测(Day 1 内容)

  1. 3 -4 1 8 2.0 —— // 向下取整所以 -7 // 2-4/ 永远得 float。
  2. bcd ef fedcba ace
  3. 打印 [1, 2, 3, 4]b = a 只是给同一个列表多起了一个名字(别名),不是复制;通过 b 修改就是修改 a
  4. 打印 Nonelist.sort() 原地排序、返回 None。改法:x = sorted([3, 1, 2]),或先 x = [3, 1, 2]x.sort()
  5. 参考:
    def count(words: list[str]) -> dict[str, int]:
        result: dict[str, int] = {}
        for w in words:
            result[w] = result.get(w, 0) + 1
        return result
    
  6. 可变默认参数:lst=[] 只在函数定义时创建一次,之后每次调用都共用同一个列表,第二次调用会看到第一次的数据。改法:lst=None,函数体里 if lst is None: lst = []
  7. None 0 True 1
  8. 3.14| 42|0742 前面 3 个空格:宽度 5 右对齐)
  9. UnboundLocalError(它是 NameError 的子类)。函数体里有 total = ... 赋值,Python 就把 total 当作局部变量,而右边的 total + n 在赋值前读取了它。改法:不用全局变量,把 total 作为参数传入并返回新值;(不推荐)或在函数开头写 global total
  10. TypeError:类型不对("3" + 1、给函数传错类型的参数);ValueError:类型对但值不合法(int("abc"));IndexError:序列下标越界(列表/字符串/元组);KeyError:字典里没有这个键。
点击展开:Day 3 联合晨测(Day 1 + Day 2)

Day 3 联合晨测(Day 1 + Day 2)

  1. [2, 4, 6] 14(1²+2²+3²)
  2. [('c', 1), ('b', 2), ('a', 2)] —— 按第二项排序;("b", 2)("a", 2) 相等,稳定排序保持原顺序,所以 ba 前。
  3. 先打印两次 done(每次调用都执行 finally),最后打印 7 -1。注意 finallyreturn 之后、真正返回之前执行。
  4. 可能报 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),但显式写编码永远不会错。
  5. 参考:
    import json
    with open("out.json", "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    
  6. 参考:
    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;原因和可变默认参数一样——所有实例会共享同一个列表。
  7. super().__init__(...)(把父类需要的参数传进去)。
  8. 参考:
    import pytest
    
    def test_divide_by_zero():
        with pytest.raises(ZeroDivisionError):
            divide(1, 0)
    
  9. 1 [2] [] —— 生成器只能遍历一次:next 取走 1,list 取走剩下的 2,再 list 已经耗尽。
  10. 参考:
    def kind(cmd: list[str]) -> str:
        match cmd:
            case ["add", _, _]:
                return "加法"
            case ["quit"]:
                return "退出"
            case _:
                return "未知"
    
点击展开:三天结业测验(笔答要点 + 限时编码参考答案)

结业测验

笔答要点

  1. 别名:两个名字指向同一个列表对象,改一个另一个也变。需要独立副本(例如要保留原数据、或函数不应修改入参)时用 lst.copy() / lst[:];嵌套列表要 copy.deepcopy
  2. with open(path, encoding="utf-8") as f: lines = [line.rstrip("\n") for line in f](或 f.read().splitlines())。
  3. 返回结果。返回值可以被测试直接断言、被其他函数复用;print 出去的东西测试抓不到、也没法再计算。把"算"和"显示"分开是可测试性的核心。
  4. try:正常执行的代码;excepttry 里抛出对应异常时执行;elsetry 没有抛异常时执行;finally:无论如何最后都执行(包括 return 之后),用于清理。
  5. {w: len(w) for w in ["a", "bb", "ccc"]}
  6. 任意 3 个,例如:json(存档)、pathlib(路径与读写)、csv(表格)、random(随机)、datetime(日期)、statistics(统计)、dataclasses(数据类)、collections(Counter/defaultdict)。
  7. __init____repr____eq__(默认还有比较相关的可选项,答出这三个即满分)。
  8. 当文件被直接运行__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) 都可以。