语法学了一堆,真正拉开差距的是"把想法做成作品"的能力。本文以一个命令行待办清单为例,带你走完选题、搭骨架、拆模块、加参数、写测试、打包发布的全过程,让第一个项目成为你的简历亮点。
1. 怎么选题
好项目的标准:解决你自己的真实问题、规模一周内能做完、能用上刚学的知识。三个方向供参考:
- 工具类:批量重命名文件、日志统计、定时提醒。
- 数据类:爬天气/股票数据做成周报、整理 CSV 报表。
- 娱乐类:猜数字游戏、贪吃蛇、命令行画图。
2. 项目骨架:命令行待办清单
先定功能:增、删、查、标记完成,用 JSON 文件存数据:
import json, os
FILE = "todos.json"
def load():
if not os.path.exists(FILE):
return []
with open(FILE, encoding="utf-8") as f:
return json.load(f)
def save(todos):
with open(FILE, "w", encoding="utf-8") as f:
json.dump(todos, f, ensure_ascii=False, indent=2)
def add(text):
todos = load()
todos.append({"text": text, "done": False})
save(todos)
print(f"已添加: {text}")
3. 模块化:别写成一坨
把数据读写单独拆成 storage 模块,主程序只负责分发命令,职责清晰、便于测试:
# todo.py —— 主入口,只做命令分发
import sys
from storage import load, save
def main():
args = sys.argv[1:]
if not args:
print("用法: python todo.py add 买牛奶")
return
if args[0] == "add":
add(" ".join(args[1:]))
if __name__ == "__main__":
main()
# storage.py —— 单独管数据读写,职责单一
import json, os
def load():
... # 实现同上
def save(todos):
... # 实现同上
4. 用 argparse 处理命令行参数
手写 sys.argv 解析太脆弱,argparse 自带帮助信息和参数校验:
import argparse
parser = argparse.ArgumentParser(description="待办清单")
parser.add_argument("action", choices=["add", "list", "done"])
parser.add_argument("text", nargs="*")
args = parser.parse_args()
if args.action == "list":
for i, t in enumerate(load(), 1):
mark = "✓" if t["done"] else "·"
print(f"{i}. {mark} {t['text']}")
5. 写测试与打包
用 pytest 给核心逻辑写测试,防止后续改动把功能改坏:
# test_todo.py
from storage import load, save
def test_save_load_roundtrip(tmp_path, monkeypatch):
monkeypatch.setattr("storage.FILE", str(tmp_path / "t.json"))
save([{"text": "买牛奶", "done": False}])
assert load()[0]["text"] == "买牛奶"
打包发布:pip install build 生成 wheel 包,或用 PyInstaller 打成免 Python 环境的可执行文件。
6. 收尾:README 与 GitHub
- README:写清"这是什么、怎么装、怎么用",配一张运行截图。
- Git 提交:小步提交,提交信息写清楚"做了什么、为什么"。
- 开源协议:加一个 MIT License,别人才能放心使用你的代码。
- 持续迭代:发布 v0.1 后收集真实反馈,再规划新功能。
💡 学习建议:别追求完美,先做出能跑的 v0.1。做完一个完整项目后回头重构一遍——拆函数、加测试、写文档,这轮"从想法到作品"的闭环比看十本书都值。