语法学了一堆,真正拉开差距的是"把想法做成作品"的能力。本文以一个命令行待办清单为例,带你走完选题、搭骨架、拆模块、加参数、写测试、打包发布的全过程,让第一个项目成为你的简历亮点。

1. 怎么选题

好项目的标准:解决你自己的真实问题、规模一周内能做完、能用上刚学的知识。三个方向供参考:

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

💡 学习建议:别追求完美,先做出能跑的 v0.1。做完一个完整项目后回头重构一遍——拆函数、加测试、写文档,这轮"从想法到作品"的闭环比看十本书都值。