🐸 青蛙编程网
首页 / 开发工具 / PyCharm / 7. 综合练习

综合练习:单词卡片本

这是什么:用 PyCharm 从零做一个真实小项目——单词卡片本(命令行):加 收录生词、考 随机抽卡片,走完「建项目 → 写 → 调 → 格式化 → 提交」的日常全流程。

为什么用:前六章的招式(解释器、补全、断点、集成工具)单练都懂,串成流水线才算会。以后学 Flask、FastAPI,每天就在这条流水线上重复。

如何用:全程在 PyCharm 里完成,每一步都用前六章的招式。

任务:单词卡片本

运行在终端的小工具,最终效果:

(.venv) PS E:\code\vocab> python cards.py 加 cherry 樱桃
已收录:cherry → 樱桃
(.venv) PS E:\code\vocab> python cards.py 考
抽到:cherry → 樱桃

流程七步

① 建项目

欢迎页 New Project:位置填 E:\code\vocab,解释器类型保持 Virtualenv → 创建。右下角出现 Python 3.x (vocab),.venv 自动建好——第 3 章的心智,一步到位。

② 写代码

项目里新建 cards.py,输入 main 按 Tab 起手,再写主体(感受补全帮你打字):

import json
import random
import sys
from pathlib import Path

STORE = Path(__file__).parent / "cards.json"


def load() -> dict[str, str]:
    if STORE.exists():
        return json.loads(STORE.read_text(encoding="utf-8"))
    return {}


def add(word: str, meaning: str) -> str:
    cards = load()
    cards[word] = meaning
    STORE.write_text(json.dumps(cards, ensure_ascii=False, indent=2), encoding="utf-8")
    return f"已收录:{word} → {meaning}"


def quiz() -> str:
    cards = load()
    word = random.choice(cards)
    return f"抽到:{word} → {cards[word]}"


def main() -> None:
    if len(sys.argv) >= 3 and sys.argv[1] == "加":
        print(add(sys.argv[2], sys.argv[3]))
    elif len(sys.argv) == 2 and sys.argv[1] == "考":
        print(quiz())
    else:
        print("用法:python cards.py 加 <单词> <释义> 或 python cards.py 考")


if __name__ == "__main__":
    main()

注意:quiz() 里故意埋了个 bug(random.choice(cards)),下一步用调试器抓它。

③ 先跑「加」

内置终端(Alt+F12)里:

python cards.py 加 cherry 樱桃
python cards.py 加 commit 提交存档
已收录:cherry → 樱桃
已收录:commit → 提交存档

项目根目录多了 cards.json——数据落盘,重启不丢(呼应 JSON 教程)。

④ 调试抓 bug

python cards.py 考

程序崩溃,最后一句是 KeyError: 0。别肉眼读代码,按第 5 章四步来:

  1. 在 word = random.choice(cards) 行打断点
  2. 右上角配置下拉 → 编辑配置 → 形参填 考 → Shift+F9 启动调试
  3. 变量区:cards 是字典 {'cherry': '樱桃', ...}
  4. Alt+F8 现场试:random.choice(cards) 报 KeyError: 0——choice 要的是序列,字典却按 0 取值

修复:改成 random.choice(list(cards))(先取键列表)。再跑 考,随机出卡片,bug 拿下。

⑤ 格式化与检查

Ctrl+Alt+L 全文件格式化;扫一眼有没有淡黄提示(可简化写法)与红线——有红线立即 Alt+Enter。

⑥ git 提交

Ctrl+K 打开提交窗 → 全选 → 信息写「初版:单词卡片本(加词/抽查)」→ 提交。第 6 章的流程,独立完成。

⑦ 扩展挑战(选做)

  • 加 列 命令:打印全部卡片(练循环与格式化输出)
  • 考 时先只显示单词,回车后再显示释义(用 input() 停顿)
  • 释义支持多义:一个词对应一个列表——练列表与字典组合

逐段精讲(核心点)

  • STORE = Path(__file__).parent / "cards.json":数据文件固定放在脚本旁边,pathlib 拼路径跨平台(Windows / macOS 都对)
  • json.dumps(..., ensure_ascii=False):不加它中文会变成 \u6a31\u6843——存中文必带
  • sys.argv:python cards.py 加 cherry 樱桃 → ["cards.py", "加", "cherry", "樱桃"],第 0 个是文件名(同 VSCode 练习的记账本)
  • random.choice(list(cards)):dict 转 list 得到键列表,choice 从中随机取一个

学完这章去哪

你已有完整流水线:PyCharm(写/调)→ venv(环境)→ git(存档)。接下来:

  1. 把 Python 基础后半段的练习全部搬进这套流程重写
  2. 想做 Web?去 Flask 或 FastAPI
  3. 多人协作前,把 Git 分支补齐

上一章:集成工具 · 配套:venv · Git 🐸

📥 下载本章代码

ZIP 内含本章全部代码文件与说明,解压即用,与教程内容同步生成。