网站是只读的
打卡和学习日志请在本地 checklist.md 里填写,改完重新 build 网站即可同步。
打卡与三档自评¶
用法:每完成一个块就打勾;每天结束填学习日志;三天结业(9/7)填第二、三部分的三档自评;一个月进阶从第五部分开始(每周日填),10/7 结业填第六、七部分。诚实比好看重要——"看提示能写"就是复习清单。
一、每日打卡¶
Day 1(周六 09-05)¶
- 准备:读完 README 第 0 节与 ai-guide 七条规则,目标抄在纸上
- Block 0 环境:
00_env_check.py输出[OK];REPL 进出过;打过断点、F10 走过一行 - Block 1
01_types_and_fstrings.py全部 [OK] - Block 2
02_strings.py全部 [OK] - Block 3a/3b
03_lists_tuples.py全部 [OK];Python Tutor 看过列表别名动画 - Block 4
04_dicts_sets.py全部 [OK] - Block 5a/5b
05_functions.py全部 [OK];Python Tutor 看过可变默认参数 - Block 6
06_debugging_bughunt.py7 个 bug 全修好,每个都写下了"现象 → 原因" - Block 7
07_mini_project_grades.py打印出报表;ruff check exercises/day1零警告 - 复盘:学习日志已写;纸上默写了 4 个语法点;22:30 前睡
Day 1 学习日志(模板见 ai-guide.md 第三节):
1. 今天最核心的一个概念(一句话讲给不会编程的同学):
2. 今天踩到的最深的坑(现象 → 原因 → 正确写法):
3. 今天独立写出的最满意的一段代码(≤10 行,凭记忆默写):
4. 明早晨测我最怕被问到的 3 个点:
5. 精力自评(1–5)与明天要调整的一件事:
Day 2(周日 09-06)¶
- 晨测:Day 1 闭卷 10 题,得分 ____ / 10
- Block 1
01_exceptions.py全部 [OK] - Block 2a 亲手复现并修复了一次
UnicodeDecodeError - Block 2a/2b
02_files_paths.py全部 [OK] - Block 3
shapes.py写完并被03_modules_stdlib.py成功导入;03全部 [OK];试过uv add rich与uv remove rich - Block 4a/4b
04_oop_dataclass.py全部 [OK] - Block 5
05_pythonic.py全部 [OK] - Block 6
uv run pytest exercises/day2/06_testing -q全绿,补写了 2 个 TODO 测试;看过一次失败输出 - Block 7
uv run pytest exercises/day2/07_grades_v2 -q全绿;grades_v2.py生成了report.txt -
uv run ruff check exercises零警告 - 复盘:AI 评审(模板 4)后改了 ≤3 条并重跑测试;学习日志已写;已选定周一项目并写下函数清单;22:30 前睡
Day 2 学习日志:
Day 3(周一 09-07)¶
- 联合晨测:得分 ____ / 10
- 项目 Block A:3 个纯函数 + 3 个测试(先红后绿)
- 项目 Block B:持久化 + 损坏恢复 + 主循环跑通"添加→查看→退出→重启还在"
- 项目 Block C:测试 ≥5(含 raises + parametrize)、1 个扩展、README 八项、
ruff format -
project/README.md验收清单 9 条全勾 - AI 评审:改了 ≤3 条,测试仍全绿
- 结业测验笔答:____ / 8;限时编码
summarize_orders在 15 分钟内 [OK]:是 / 否 - 三档自评表(下方)已填
- 后续 4 周计划已写;D+1 / D+3 / D+7 / D+30 提醒已设
Day 3 学习日志:
二、A 档(必须掌握)自评表——周一结业时闭卷填写¶
在每行选一个:默 = 能不看资料默写并调通;提 = 看一眼提示/文档能写出来;否 = 不会。所有"提"和"否"进入 D+3 复习清单。
| 知识点 | 默 | 提 | 否 |
|---|---|---|---|
用 uv run python 文件 运行脚本;进出 REPL;Ctrl+C 中断 |
|||
| VS Code 打断点、F10 单步、看变量面板 | |||
/ // % ** 的区别;input() 返回字符串;int()/float()/str() |
|||
f-string:{x:.2f}、{x:>8}、{x:02d}、{x=} |
|||
真值判断;and/or/not 短路;链式比较 |
|||
字符串索引/切片/[::-1];不可变 |
|||
strip/split/join/replace/upper/lower/startswith/find/count/isdigit |
|||
转义与 r"...";三引号 |
|||
列表 append/extend/insert/pop/remove/index;sort() vs sorted() |
|||
for / enumerate / zip / range(a, b, c) |
|||
列表别名 vs copy();遍历时不修改列表 |
|||
元组、解包、a, b = b, a、多返回值 |
|||
字典增删改查、get、items() 遍历 |
|||
计数模式 d[k] = d.get(k, 0) + 1;分组模式 setdefault |
|||
| 键必须可哈希;列表里装字典的嵌套结构 | |||
| 列表推导式(含条件) | |||
def/参数/默认值/return/docstring |
|||
可变默认参数陷阱及 None 写法 |
|||
局部 vs 全局作用域;为什么不用 global |
|||
| 把 50 行程序拆成 4–6 个函数 | |||
| 读 Traceback;9 种常见异常的含义 | |||
try/except 具体异常/else/finally;输入校验循环;raise |
|||
不写裸 except: |
|||
with open(path, encoding="utf-8");r/w/a;逐行读 |
|||
为什么必须写 encoding="utf-8"(GBK / 3.15) |
|||
pathlib.Path:/、exists、read_text、write_text |
|||
json.load/dump(ensure_ascii=False, indent=2);FileNotFoundError 恢复 |
|||
import 三种写法;if __name__ == "__main__":;自己写模块 |
|||
random.randint/choice/shuffle;math.sqrt/floor/ceil/pi |
|||
不用 from x import *;不把文件命名为标准库名 |
|||
class/__init__/self/方法/创建对象 |
|||
sorted(key=lambda ...);any/all;sum(生成器表达式) |
|||
| 算与打印分离(纯函数可测试) | |||
PEP 8:snake_case、4 空格、有意义的名字 |
统计:默 ____ / 34 提 ____ 否 ____
三、B 档(了解会用)自评——只勾"用过并能看文档再用"的¶
-
@dataclass+field(default_factory=list)- [ ]__str__/__repr__/__eq__- [ ] 继承与super()- [ ]@property - 自定义异常类 - [ ]
csv.DictReader/DictWriter- [ ]glob、.name/.suffix/.stem- [ ]datetime/timedelta -
Counter/defaultdict- [ ]statistics- [ ]sys.argv- [ ]uv add第三方库 - 生成器
yield- [ ] 字典/集合推导式 - [ ]match语句 - [ ] 类型注解list[int]、X | None -
*args/**kwargs、仅关键字参数 - [ ]lambda、函数作参数 - [ ] 集合运算 - [ ] 深拷贝 - pytest:
test_*.py、raises、parametrize- [ ]ruff check/format- [ ] VS Code Watch 表达式
四、C 档(知道存在)——能说出"它解决什么问题、该搜什么"即可¶
asyncio / 多线程与 free-threading / JIT / 子解释器 / t-strings / 注解延迟求值 / Python 3.15 的 UTF-8 默认与 lazy import / 装饰器与闭包 / 递归 / 正则 re / 打包发布 / Git / numpy·pandas·pygame·FastAPI·rich 各自是什么
第二阶段:一个月进阶(9/8 – 10/7)¶
计划见
plan/month-overview.md与plan/week1.md…week4.md、plan/capstone.md。每周日晚做周测 + 填本表;10/7 结业时填"五、进阶 A 档三档复评"。
五、每周打卡¶
第 1 周(9/8 – 9/13)语言进阶¶
- 周一 M1 生成器/迭代器 - [ ] 周二 M2 闭包/装饰器 - [ ] 周三 M3 上下文管理器与函数式 - [ ] 周四 M4a 数据模型
- 周六 M4b OOP/dataclass/Protocol + M5 异常与新语法 - [ ] 周日 小项目
exercises/week1/project_pipeline测试全绿 -
uv run pytest exercises/week1 -q全绿 - [ ] 周测quiz_week1____ / 20 - [ ] 周日志(学到 / 卡住 / 下周先做) - 本周提交 ≥5 次
git commit
第 2 周(9/14 – 9/20)工程化¶
- 周一 M6a src 布局/pyproject/uv(
uv run kb hello可用) - [ ] 周二 Git + cnb.cool 推送成功 + M7a typing - 周三 M7b typing 进阶/类型检查器/ruff 规则 - [ ] 周四 M8a Pydantic 模型与校验 - [ ] 周五 M8b 序列化/JSON Schema/Settings
- 周六 M9 logging + M10 正则 + M11 文件与 SQLite - [ ] 周日
projects/kb测试全绿、覆盖率 ≥80%、ruff 零警告、已推送 -
uv run pytest exercises/week2 -q全绿 - [ ] 周测quiz_week2____ / 20 - [ ] 周日志
第 3 周(9/21 – 9/27)并发与网络¶
- 周一 M12 pytest 进阶(
w3_01覆盖率 ≥95%) - [ ] 周二 M13 线程/进程/subprocess - [ ] 周三 M14a asyncio 基础 - 周四 M16 性能测量 - [ ] 周五 M14b asyncio 进阶 - [ ] 周六 M15 httpx + 聚合器启动 - [ ] 周日
projects/aggregator全绿、bench达标、已推送 -
uv run pytest exercises/week3 -q全绿 - [ ] 周测quiz_week3____ / 20 - [ ] 周日志(含 bench 三组数字)
第 4 周(9/28 – 10/4)Web、架构与综合项目¶
- 周一 M17a FastAPI 入门 - [ ] 周二 M17b 依赖注入/路由/lifespan - [ ] 周三 M17c 异步端点/SSE/中间件/鉴权
- 10/1 M18 架构与封装(重构 kata 全绿)+ M19 安全审查(≥5 项发现、修 3 项)+ 服务器实操
- 10/2 Notebook M1 - [ ] 10/3 M2 - [ ] 10/4 M3 - [ ] 周测
quiz_week4____ / 20 - [ ] 周日志
收官(10/5 – 10/7)¶
- 10/5 Notebook M4:覆盖率 ≥80%、ruff/Pylance 零错误、README、
.env.example - 10/6 Notebook M5:AI 评审 → 重构 ≤5 条 → 回归;
uv build;tagv1.0.0;复盘 - 10/7 结业测验
exercises/final/quiz_final.md____ / 30;填写下方"六";把"提/否"条目排进 D+3/D+7/D+30
六、进阶 A 档自评表——10/7 结业时闭卷填写(默 / 提 / 否)¶
| 知识点 | 默 | 提 | 否 |
|---|---|---|---|
生成器函数与生成器表达式;惰性、只能遍历一次;itertools 常用组合 |
|||
闭包晚绑定与修法;nonlocal |
|||
装饰器(带参、functools.wraps、ParamSpec 类型);inspect.signature |
|||
上下文管理器(类 + @contextmanager);ExitStack 知道 |
|||
dataclass(frozen、field(default_factory)、order);__eq__/__hash__ 关系 |
|||
魔术方法:__repr__、__len__/__getitem__/__iter__、__enter__/__exit__、比较与运算 |
|||
Protocol vs ABC;依赖注入(构造函数传接口) |
|||
异常层次设计;raise ... from e;ExceptionGroup/except*;try/else/finally 语义 |
|||
PEP 695 泛型、TypedDict、Literal、Annotated、TypeIs;Pylance 零错误 |
|||
src 布局、pyproject.toml(PEP 621/735)、[project.scripts]、uv workspace |
|||
| Git:分支/合并/撤销/stash;Conventional Commits;推送 cnb.cool | |||
Pydantic:Field 约束、field_validator/model_validator、ConfigDict(extra="forbid")、model_dump(mode="json")、TypeAdapter、model_json_schema() |
|||
pydantic-settings + .env + .env.example;密钥不入库 |
|||
logging:getLogger(__name__)、只在入口配置、exception vs error、文件 UTF-8 轮转、JSON 格式 |
|||
正则:命名分组、贪婪/懒惰、VERBOSE、finditer/sub 传函数;何时不用正则 |
|||
文件:pathlib 全家、原子写、utf-8-sig、json.dump(default=)、tomllib、UTC 时间 |
|||
sqlite3:参数化、with conn:、Row、幂等建表、索引 |
|||
pytest 进阶:fixture 作用域/yield/conftest、monkeypatch/tmp_path/caplog、parametrize、mock 打到使用处、覆盖率 |
|||
线程 vs 进程 vs asyncio 的选择;ThreadPoolExecutor、Lock、ProcessPoolExecutor + __main__ 守卫 |
|||
subprocess.run 列表参数、超时、capture_output、UTF-8 |
|||
asyncio:协程/Task、gather vs TaskGroup、asyncio.timeout、取消、Semaphore、Queue、异步生成器、to_thread |
|||
httpx:Client/AsyncClient 复用、显式超时、raise_for_status、流式、MockTransport 测试、tenacity 重试原则 |
|||
性能:perf_counter/timeit/cProfile/tracemalloc;先测量再优化 |
|||
FastAPI:路径/查询/请求体、response_model、422 结构、Depends/Annotated、APIRouter、lifespan、异常处理器、dependency_overrides |
|||
FastAPI:同步 vs 异步端点、BackgroundTasks、fastapi.sse、中间件、X-API-Key 依赖、ASGITransport 测试 |
|||
| 分层架构:routers/services/repositories/schemas/domain;领域异常 → HTTP 映射;纯核心 + 命令式外壳 | |||
安全清单:输入校验、路径穿越、shell=False、参数化 SQL、密钥、CORS、超时与重试 |
|||
Linux 服务器:ssh/uv 安装/uv run uvicorn/tmux/ssh -L |
统计:默 ____ / 28 提 ____ 否 ____
七、结业复盘(按 plan/capstone.md 第 5 节模板填写)¶
- 三个最有价值的知识点:
- 三个最难的 bug(现象 → 根因 → 工具):
- 重做一次会改的架构决定:
- 对照
learn-agent计划,已就位的 Python 前置: - 下一个 30 天的三件事: