Week 1 学习计划|Python 对象模型与数据结构
Week 1 学习计划:7 天约 14–16 小时,从对象模型与数据结构出发,目标独立设计并验证一个 Mini Key-Value Store。
这份计划是我和 AI 讨论后定下的第一周安排。
总目标:从“会用 Python”提升到“理解 Python + 能独立设计数据结构”。 总投入:约 14–16 小时。 原则:先自己做,卡住再查资料;核心代码不让 AI 直接生成。
计划与成果已拆成两篇:本篇只保留当时的任务与要求,实际产出和实测数据见学习成果篇。
计划:Day 1 | Day 2 | Day 3 | Day 4 | Day 5 | Day 6 | Day 7 | 最终产出成果:见学习成果篇
Day 1|对象、引用、可变性
时间:1.5–2h
学习 45min
阅读:
- Python Tutorial:Objects / Names / Assignment(Naming and binding,名字与绑定)
- copy 官方文档(浅拷贝 / 深拷贝)
掌握:
- object
- variable / name
- reference
- assignment
id()isvs==- mutable / immutable
- aliasing
实验 45min
自己创建 object_demo.py,完成:
a = ba == 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 + Big-O
时间:1.5–2h | ✅ 已完成(delete 与 1,000,000 未测)| 成果:复杂度实测与对照表
学习 40min
掌握:list、tuple、dict、set、hash、hash table、Big-O。
带着这些问题去学,答案和实测数据见成果篇:
- list 为什么随机访问 O(1)?
- list 为什么头部插入 O(n)?
- dict 为什么平均查找 O(1)?
- set 为什么 membership 平均 O(1)?
- 为什么“平均 O(1)”不等于“永远 O(1)”?
实验 50min
自己测试:
- list:index、append、insert(0)、search
- dict:get、set、membership
- set:add、membership
数据规模:1,000 / 10,000 / 100,000 / 1,000,000(1,000,000 视时间补测)。
输出 30min
写 complexity.md 复杂度对照表:list / dict / set 在访问、查找、插入、删除、membership 上的复杂度,实测过的标 ✅,没测的如实标注。
Day 3|Function + Scope + Copy
时间:1.5–2h | ✅ 已完成 | 成果:object_model.md 全文
学习 45min
掌握:
- function object
- parameter / argument
- return
- default argument(默认参数)
*args/**kwargs(任意参数列表)- namespace
- LEGB(作用域与命名空间)
- global
- nonlocal
- shallow copy
- deep copy
编程实验 45min
完成:
def add(a, b):
...
f = add
验证:函数是不是对象?
然后完成:
x = 10
def test():
x = 20
print(x)
以及:
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。今天不看教程,直接写。✅ 已完成(2026-09-04)| 成果:解法与总结
Task 1:数据去重
输入:
users = [
{"id": 1, "name": "A"},
{"id": 2, "name": "B"},
{"id": 1, "name": "A"},
]
实现:
- list 版本
- set/dict 版本
要求:比较两个版本复杂度。
Task 2:频率统计
输入:apple banana apple orange banana apple
输出:
apple: 3
banana: 2
orange: 1
要求:不使用 Counter,再使用 Counter,比较两种方案。
Task 3:多字段排序
数据:
users = [
{"name": "A", "age": 20, "score": 90},
{"name": "B", "age": 20, "score": 95},
{"name": "C", "age": 19, "score": 95},
]
要求:score 降序 → age 升序 → name 升序。
必须自己理解:sorted 与 Sorting HOW TO(key、lambda、stable sort)。
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|Level 3:Mini Key-Value 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
└── test_store.py
实现:
class KeyValueStore:
def set(...)
def get(...)
def delete(...)
def exists(...)
def 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|Benchmark + 最终验收
时间: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 倍会怎样?
Day 7 最后 1 小时|无 AI 答辩
关闭 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)?MiniKV 为什么使用 dict?
如果能够脱离资料讲清楚,Week 1 完成。
第一周最终产出
周末必须有:
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
最终标准
- Level 1:能解释 Python 对象、引用、可变性、作用域、常见数据结构。
- Level 2:不看教程独立完成去重、频率统计、排序、LRU。
- Level 3:自己设计并实现 Mini Key-Value Store,并用 Benchmark 验证自己的复杂度判断。
时间不够时的优先级:MiniKV > LRU > 数据结构实验 > 理论阅读 > 笔记美化。
这周不要追求“把 Python 学完”。把这几个问题真正吃透,比看完一门 Python 课程价值高得多。
来源与延伸阅读
- Python 官方文档:教程与标准库入口
- Naming and binding(名字、引用与赋值)
- copy 模块(浅拷贝 / 深拷贝)
- 数据结构教程(list / tuple / dict / set)
- Glossary:hashable
- Hash table(哈希表)
- Big-O notation(大 O 记号)
- Python 作用域与命名空间(LEGB)
- 函数定义详解(默认参数、任意参数列表)
- Sorting HOW TO(sorted / key / lambda / stable sort)
- collections.Counter(频率统计)
- functools.lru_cache(LRU 参考实现)
- timeit(基准测试计时)
- matplotlib(画图)