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

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

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

Pythondata-structuresbig-olru-cachelearning-plan

这份计划是我和 AI 讨论后定下的第一周安排。

总目标:从“会用 Python”提升到“理解 Python + 能独立设计数据结构”。 总投入:约 14–16 小时。 原则:先自己做,卡住再查资料;核心代码不让 AI 直接生成。

计划成果已拆成两篇:本篇只保留当时的任务与要求,实际产出和实测数据见学习成果篇

计划Day 1Day 2Day 3Day 4Day 5Day 6Day 7最终产出成果:见学习成果篇

Day 1|对象、引用、可变性

时间:1.5–2h

学习 45min

阅读:

掌握:

  • object
  • variable / name
  • reference
  • assignment
  • id()
  • is vs ==
  • mutable / immutable
  • aliasing

实验 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)

写出 abc 并解释原因。

验收 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、sethashhash tableBig-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

掌握:

编程实验 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 升序。

必须自己理解:sortedSorting HOW TO(keylambda、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,写出:

操作ListDict
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 课程价值高得多。

来源与延伸阅读

  1. 01Week 1 学习计划|Python 对象模型与数据结构week-1计划
  2. 02学习计划:从 Python开始到认识Data/AI计划
  3. 03Week 1 学习成果|复杂度实测、对象模型与数据结构实战week-1成果
  4. 04Week 2 学习计划|Python 函数、抽象与模块化week-2计划
  5. 05Week 2 学习成果|模块机制、异常体系与工程化重构week-2成果