为什么要做项目:把语法变成作品
学了很多语法,怎么判断真的会了?做一个小项目。项目会把变量、条件、循环、函数、文件读写全部串起来,逼着你"想清楚再写",而不是照着教程抄。
今天做的是命令行记账小工具:可以添加收支、查看列表、算余额、存到文件里下次还能读。麻雀虽小,五脏俱全,它拥有真实软件的完整流程。
项目是语法的"考场",也是信心的来源。
- 需求先设计再写码。
- 函数按功能拆分。
- 文件数据持久化。
- 交互命令行菜单。
需求分析:先想清楚做什么
动手前先列需求清单,写清楚功能点:
- 添加收入/支出(类型、金额、说明);
- 查看全部记录;
- 计算当前余额;
- 退出时保存到文件,下次启动自动加载。
需求越清楚,代码越不容易返工。这个"先列清单再写"的习惯,是专业开发的第一步。
设计结构:函数划分
按功能拆函数:add_record() 加记录、show_records() 显示、get_balance() 算余额、save_data()/load_data() 读写文件。每个函数只做一件事。
def add_record(records, kind, amount, note):
records.append({"kind": kind, "amount": amount, "note": note})
def get_balance(records):
total = 0
for r in records:
if r["kind"] == "income":
total += r["amount"]
else:
total -= r["amount"]
return total
数据用"字典列表"组织:每条记录一个字典,所有记录一个列表,结构清晰又好遍历。
数据存储:文件读写
内存里的数据一关程序就没了,要存到文件里。用 open() 配合 json 模块,把列表转成 JSON 文本保存,读的时候再转回来。
import json
def save_data(records, path="data.json"):
with open(path, "w", encoding="utf-8") as f:
json.dump(records, f, ensure_ascii=False)
def load_data(path="data.json"):
try:
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
except FileNotFoundError:
return []
try/except 处理"文件还不存在"的情况,返回空列表——这是真实程序里最常见的防御写法。
主循环:命令行交互
主程序用一个 while 循环做菜单:打印选项、读用户输入、按选择调用对应函数。
while True:
print("1 添加收入 2 添加支出 3 查看 4 余额 5 退出")
choice = input("请选择:")
if choice == "5":
save_data(records)
break
# 其他分支调用对应函数
这个"菜单循环"是命令行工具的通用骨架:改改菜单项,就能变成单词本、待办清单、题库刷题器。
测试与优化
写完必须测:添加一笔收入、一笔支出、退出重进,确认数据还在、余额算得对。再试试"乱输入"(输入非数字金额),程序会不会崩——加个异常处理让它优雅提示。
try:
amount = float(input("金额:"))
except ValueError:
print("金额必须是数字")
return
优化方向:记录加时间戳、按分类统计、输出美化对齐。每加一个功能,就再测一轮——这就是"测试驱动"的初级形态。
发布与下一步
把这个工具给爸妈同学用一用,收集反馈再改进——发布不是终点,是下一轮迭代的开始。可以把它放进 Git 仓库管理(参考我们的"Git 版本控制入门"),以后每个版本都有存档。
下一步项目建议:待办清单(带优先级)、单词记忆卡(带随机抽背)、简易密码本(配合 SQL 数据库入门存数据)。项目做得越多,语法用得越熟。
- 先需求再写代码。
- 函数拆分每函数一件事。
- 文件持久化数据不丢。
- 测了再发发布即迭代。