文章
学习
从 Python 到 Data/AI 一年计划计划第 1 / 10 篇 对应成果

Week 1 学习计划|Python 对象模型与数据结构

Week 1 学习计划:7 天约 14–16 小时,从对象模型与数据结构出发,目标独立设计并验证一个 Mini Key-Value Store。

Pythondata-structuresbig-olru-cachelearning-plan

本周计划对应一年学习计划总纲 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。

✍️ 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,写出下表:

操作ListDict
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

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 学完”,把这几个问题真正吃透更重要。

来源与延伸阅读

  1. 01Week 1 学习计划|Python 对象模型与数据结构week-1计划
  2. 02一年学习计划:从 Python 到 Data/AI 系统的 52 周计划
  3. 03Week 1 学习成果|复杂度实测、对象模型与数据结构实战week-1成果
  4. 04Week 2 学习计划|Python 函数、作用域、闭包与模块化week-2计划
  5. 05Week 2 学习成果|闭包、decorator 与工程化重构week-2成果
  6. 06Week 3 学习计划|异常、测试与 Debuggingweek-3计划
  7. 07Week 3 学习成果|异常、traceback 与 Debug 起步week-3成果
  8. 08Week 4 学习成果|Big-O 与四类基础算法week-4成果
  9. 09Week 5 学习成果|Stack、Queue 与 MinHeapweek-5成果
  10. 10Week 6 学习成果|图算法与 Python Engineering Toolkitweek-6成果