Week 1 学习计划|Python 对象模型与数据结构
Week 1 学习计划:7 天约 14–16 小时,从对象模型与数据结构出发,目标独立设计并验证一个 Mini Key-Value Store。
本周计划对应一年学习计划总纲 Phase I 的 Week 1 · Python 对象模型与核心数据结构,按总纲 Part II「每周固定执行模板」编排。总投入约 14–16 小时;原则是先自己做、卡住再查资料,核心代码不让 AI 直接生成。计划篇只保留任务与要求,实际产出和实测数据见Week 1 学习成果。
🎯 本周目标
L1
- 能解释可变对象 / 不可变对象、引用,以及为什么 dict / set 通常查找较快。
L2
- 不看教程独立完成 set 去重、frequency counter,并独立实现简单 KV Store 的
set/get/delete/exists/keys。
L3
- (总纲本周等级为 L2,不设 L3)
📚 Core Knowledge
总纲 Week 1 学习内容:
object / reference / mutable / immutable / list / tuple / dict / set / shallow copy / deep copy / hash。
- Naming and binding(名字、引用与赋值):object / name / reference / assignment /
id()/isvs==/ mutable / immutable / aliasing - copy 模块(浅拷贝 / 深拷贝)
- 数据结构教程(list / tuple / dict / set)、Glossary:hashable、Hash table(哈希表)
- Big-O notation(大 O 记号):支撑“为什么 dict / set 查找较快”的复杂度背景
✍️ Human Core
总纲 Week 1 要求手写:
- list 基本操作
- dict 基本操作
- set 去重
- frequency counter
- 简单 KV Store
按日拆解如下。
Day 1|对象、引用、可变性(1.5–2h)
学习 45min:阅读 Naming and binding 与 copy 文档,掌握 object、name、reference、assignment、id()、is vs ==、mutable / immutable、aliasing、shallow copy、deep copy。
实验 45min:自建 object_demo.py,完成 a = b、a == b / a is b、list alias、string immutable、tuple immutable、list mutable、id() 变化、shallow copy、deep copy。
重点实验:
a = [1, 2, [3, 4]]
b = a
c = a.copy()
c[2].append(5)
写出 a、b、c 并解释原因。
验收 15min:不用资料解释 = 做了什么、is 与 == 区别、mutable / immutable、shallow / deep copy。
Day 2|List / Dict / Set + Hash(1.5–2h)
学习 40min:掌握 list、tuple、dict、set、hash、hash table、Big-O,理解 dict / set 为什么通常查找较快。
实验 50min:手写 list / dict 的基本操作与 set 去重,理解哈希表如何支撑 O(1) 查找。
输出 30min:写 complexity.md 复杂度对照表。
Day 3|Function + Scope + Copy(1.5–2h)
学习 45min:掌握 function object、parameter / argument、return、default argument、*args / **kwargs、namespace、LEGB、global、nonlocal、shallow / deep copy。
编程实验 45min:
def add(a, b):
...
f = add # 验证函数是对象
funcs = []
for i in range(3):
funcs.append(lambda: i)
print([f() for f in funcs]) # 解释为什么不是 [0, 1, 2]
验收 20min:写一页 object_model.md,解释 name → object → reference → scope。
Day 4|数据结构实战(2h)
今天不看教程,直接写。
Task 1:数据去重
users = [
{"id": 1, "name": "A"},
{"id": 2, "name": "B"},
{"id": 1, "name": "A"},
]
实现 list 版本与 set/dict 版本,比较复杂度。
Task 2:frequency counter
输入 apple banana apple orange banana apple,输出 apple: 3 / banana: 2 / orange: 1。不使用 Counter 实现一次,再使用 Counter 实现一次,比较两种方案。
Day 5|LRU Cache(2–2.5h)
理解 LRU 20min:容量 3,访问序列 A B C A D,推演最终缓存(参考 LRU 缓存淘汰策略 与 functools.lru_cache)。
第一版 40min:用 dict + list 实现 get(key)、put(key, value),允许 O(n)。
分析 20min:回答为什么这个实现不能做到 O(1)?
第二版 60min:设计 HashMap + Doubly Linked List,实现 LRUCache(capacity)、get(key)、put(key, value),目标 get / put 平均 O(1)。
测试 20min:正常读取、重复读取、覆盖、淘汰、capacity = 1、capacity = 0、不存在 key。
Day 6|简单 KV Store(3–4h)
这是本周核心任务。
设计 30min:自己写需求 set(key, value) / get(key) / delete(key) / exists(key) / keys(),确定 key 不存在怎么办、delete 不存在怎么办、set 已存在 key 怎么办、value 可以是什么类型。
设计数据结构 30min:比较方案 A list[(key, value)] 与方案 B dict,写出下表:
| 操作 | List | Dict |
|---|---|---|
| set | ||
| get | ||
| delete | ||
| exists | ||
| keys |
最终解释为什么选择 dict。
独立实现 90min:创建 kv_store/store.py 与 kv_store/test_store.py,实现 KeyValueStore 的 set / get / delete / exists / keys。这一部分禁止 AI 直接生成。
测试 30min:空 Store、set/get、覆盖、delete、不存在 key、多个 key、重复 delete、None、list / dict 作为 value。
思考 30min:如果 value 是 list,用户修改返回值会不会影响 Store 内部数据?
store.set("x", [1, 2, 3])
data = store.get("x")
data.append(4)
写下你的设计选择(不用马上解决)。
Day 7|验收(3h)
Part 1|Benchmark 60min:比较 List KV Store vs Dict KV Store,数据量 1,000 / 10,000 / 100,000 / 1,000,000,测试 get、set、delete、exists,用 timeit 计时,画一张图(如 matplotlib)。
Part 2|最终技术总结 45min:写 week01_review.md,回答:
Python:变量是什么?= 是复制吗?is / ==?mutable / immutable?shallow / deep copy?LEGB?
数据结构:list 随机访问为什么 O(1)?list 头部插入为什么 O(n)?dict 为什么平均 O(1)?dict 什么情况下会退化?set 为什么适合 membership?
LRU:为什么 dict 不够?为什么 list 不够?HashMap + Doubly Linked List 为什么可以 O(1)?
KV Store:为什么最终选择 dict?每个操作复杂度是多少?keys() 为什么是 O(n)?数据量扩大 100 倍会怎样?
Part 3|无 AI 答辩 60min:关闭 AI 与资料,拿纸回答“为什么 dict 平均 O(1),但不能说 dict 永远 O(1)”,必须自己讲完整:
key
↓
hash()
↓
hash value
↓
hash table
↓
collision
↓
average case
↓
worst case
随机抽查:shallow copy 是什么?为什么 b = a 不是复制?LRU 为什么需要两个数据结构?为什么 list lookup 是 O(n)?为什么 dict lookup 平均 O(1)?KV Store 为什么使用 dict?能脱离资料讲清楚,Week 1 完成。
🤖 AI Build
总纲 Week 1 要求:完善第一版 KV Store 的目录结构。
-
storage/ -
core/ -
cli/ -
config/ -
tests/
🧪 Experiment
总纲 Week 1 要求:比较 list、dict、set 的查找、插入、删除实际性能。
Hypothesis
- 哈希表(dict / set)的 get / set / membership 应保持常数级;list 的查找与头部插入应随数据量线性增长。
Experiment
- 用 timeit 对 list index / append / insert(0) / search,dict get / set / membership,set add / membership 在 1,000 / 10,000 / 100,000 三个规模上计时(repeat=5 取均值)。
Result
- 数据与结论见Week 1 学习成果。
Conclusion
- 验证了假设;delete 类操作与 1,000,000 规模当周未测,如实标注为“未实测”。
📝 数智工程师考试映射
- Python 对象模型与内存模型基础
- 基础数据结构(list / dict / set)与哈希表原理
✅ Acceptance
总纲 Week 1 验收:
L1
- 能解释可变对象 / 不可变对象
- 能解释引用
- 能解释为什么 dict / set 通常查找较快
L2
- 独立完成
set/get/delete/exists/keys
L3
- 总纲本周不设 L3
🧠 本周最重要的问题
为什么 dict / set 通常查找较快?如果哈希冲突或触发扩容,会发生什么?
❓ 尚未解决
- 总纲 Experiment 要求覆盖“删除性能”,但 delete 类操作(
list.pop(0)/list.remove()/dict del/set discard)与 1,000,000 规模当周未测 - KV Store 的
get返回可变对象时是否应允许调用方修改内部数据,当周只写下设计选择未定论
📊 Final Level
L2
第一周最终产出
week01/
├── exercises/
│ ├── dedup.py
│ ├── frequency.py
│ └── sorting.py
├── lru/
│ ├── lru_cache.py
│ └── test_lru.py
├── kv_store/
│ ├── store.py
│ └── test_store.py
├── benchmarks/
│ └── benchmark.py
├── notes/
│ ├── object_model.md
│ └── complexity.md
└── week01_review.md
时间不够时的优先级:KV Store > LRU > 数据结构实验 > 理论阅读 > 笔记美化。这周不追求“把 Python 学完”,把这几个问题真正吃透更重要。
来源与延伸阅读
- 01Week 1 学习计划|Python 对象模型与数据结构
- 02一年学习计划:从 Python 到 Data/AI 系统的 52 周
- 03Week 1 学习成果|复杂度实测、对象模型与数据结构实战
- 04Week 2 学习计划|Python 函数、作用域、闭包与模块化
- 05Week 2 学习成果|闭包、decorator 与工程化重构
- 06Week 3 学习计划|异常、测试与 Debugging
- 07Week 3 学习成果|异常、traceback 与 Debug 起步
- 08Week 4 学习成果|Big-O 与四类基础算法
- 09Week 5 学习成果|Stack、Queue 与 MinHeap
- 10Week 6 学习成果|图算法与 Python Engineering Toolkit