第 0 步 · 毕业标准
节点 ⑨ 不做"教程",给你需求 + 设计 + 验收标准,自己动手。完成后你将拥有:一个能长期使用的背单词工具 + 一份"我能独立写程序"的证据。
- 用到的知识:① 语法与控制流 ② 数据结构 ③ 函数 ④ 文件/JSON/异常 ⑤ 类 ⑥ 标准库(random/datetime/collections) ⑦ CSV ⑧ 网络(选做加分项)。
- 验收:程序能跑、数据能存、遇到脏输入不崩溃、README 能说清怎么用。
第 1 步 · 需求(做什么)
一个命令行背单词工具 vocab.py:
- 词库:JSON 文件存单词(
{"word": "resilience", "meaning": "韧性", "tag": "考研"}),内置一份启动样例。 - 学习:
python vocab.py learn随机出题(英→中 / 中→英 / 拼写),答对答错都记录。 - 复习:
python vocab.py review只出"错过的词"(按记忆曲线简化:错过的明天再来)。 - 统计:
python vocab.py stats显示总词数、已学会、正确率、今天学了几个。 - 导出:
python vocab.py export把"不会的词"导出 CSV。
第 2 步 · 设计(数据怎么组织)
2.1 数据结构
# data/vocab.json —— 词库
{"resilience": {"meaning": "韧性", "tag": "考研"}}
# data/progress.json —— 学习进度
{"resilience": {"correct": 3, "wrong": 1, "last": "2026-08-12", "next": "2026-08-13"}}
2.2 代码结构(函数划分)
vocab.py
├── load_json(path, default) # 读 JSON(④),不存在返回默认(④)
├── save_json(path, data) # 写 JSON(④)
├── pick_question(vocab, progress) # 随机选词与题型(②⑥ random)
├── ask(word, entry, mode) # 出一道题,返回对错(①)
├── record(progress, word, ok) # 更新进度 + 定 next 日期(⑥ datetime)
├── do_learn(vocab, progress) # learn 流程(① 循环)
├── do_review(vocab, progress) # review 流程(⑥ 按日期筛选)
├── do_stats(vocab, progress) # 统计(② 字典 + ⑦ 思路)
└── do_export(vocab, progress) # 导出 CSV(⑦)
先画结构再写码——这就是"设计"。每个函数只干一件事,主程序(main)只负责调度。写到一半卡住时,回来对照这张图。
第 3 步 · 核心代码片段(自己补全其余部分)
3.1 主程序骨架(if __name__ 保护,⑥学的)
import sys, json, random, datetime, csv
from pathlib import Path
DATA = Path("data")
def load_json(name, default):
"""读取 data/name;文件不存在返回 default"""
p = DATA / name
if not p.exists():
return default
with open(p, "r", encoding="utf-8") as f:
return json.load(f)
def save_json(name, data):
DATA.mkdir(exist_ok=True)
with open(DATA / name, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def main():
cmd = sys.argv[1] if len(sys.argv) > 1 else "learn"
vocab = load_json("vocab.json", SAMPLE)
progress = load_json("progress.json", {})
if cmd == "learn": do_learn(vocab, progress)
elif cmd == "review": do_review(vocab, progress)
elif cmd == "stats": do_stats(vocab, progress)
elif cmd == "export": do_export(vocab, progress)
else: print("用法: python vocab.py [learn|review|stats|export]")
if __name__ == "__main__":
main()
3.2 出一道题(模式随机:英译中 / 中译英 / 拼写)
def ask(word, entry):
mode = random.choice(["en2zh", "zh2en", "spell"])
if mode == "en2zh":
answer = input(f"{word} 的中文是?").strip()
return answer == entry["meaning"]
if mode == "zh2en":
answer = input(f"「{entry['meaning']}」的英文是?").strip().lower()
return answer == word.lower()
# spell:显示乱序字母,让用户拼出单词
letters = list(word); random.shuffle(letters)
answer = input(f"拼写:{''.join(letters)} ({entry['meaning']})→").strip().lower()
return answer == word.lower()
3.3 记录进度(答对 3 次 = 学会;答错 → 明天再来)
def record(progress, word, ok):
p = progress.setdefault(word, {"correct": 0, "wrong": 0, "next": ""})
if ok:
p["correct"] += 1
else:
p["wrong"] += 1
p["next"] = (datetime.date.today() + datetime.timedelta(days=1 if ok else 0)).isoformat()
# 答错:next=今天 → review 立刻再考;答对:明天
第 4 步 · 验收清单(对照自查)
python vocab.py learn能跑,随机出 10 题并判对错python vocab.py review只出"今天该复习的"(答错过的词)python vocab.py stats显示学会数 / 正确率 / 今日学习数python vocab.py export导出不会的词到 CSV,Excel 打开不乱码- 数据存进
data/*.json,重启程序进度还在 - 乱输入(空回车 / 非选项)不崩溃
- 写一个 README.md:怎么装、怎么用、数据结构说明
- (选做加分)加
python vocab.py add 单词 释义手动加词 - (选做加分)加"打卡日历":
python vocab.py streak显示连续学习天数
第 5 步 · 复盘:你走过的路
- ① 能写程序 → ② 能组织数据 → ③ 能封装逻辑 → ④ 能持久化与防错 → ⑤ 能建模世界 → ⑥ 会用官方武器 → ⑦ 能处理数据 → ⑧ 能让程序上网。
- 毕业项目把它们拧成一股绳。这个工具真的有用——背单词、记番茄、管文件,都是同一个骨架。
- 下一步去向:回 AI 精通之路 主线(m3 机器学习基础起),或补 Python for Everybody 进阶(网络爬虫、数据库),或自己开一个新工具项目。
毕业纪念:给这个工具起个名字、写进你的 README、把"第一个自己设计的程序"记进工作日志。代码会过时,但"我能独立造工具"的信心不会。