刚开始学 Python 时,最容易卡住的不是语法,而是“知道几个概念,却跑不出一个完整结果”。我把第一个练习收敛成一个命令行文本统计器:读取文件、统计词频、打印结果,再把重复逻辑拆进模块。
这个过程不追求一次学完所有语法,只验证一条闭环:能把问题拆开,写出脚本,运行并检查输出,最后让代码可以复用。
先把学习目标变成一个可运行任务
任务输入是一段文本文件,输出出现次数最多的 5 个单词。它足够小,但会自然用到字符串处理、字典、循环、函数和异常处理。

图:把抽象的“学 Python”拆成问题、脚本、验证、复用和迭代五个可检查节点。
目录先保持简单:
python-demo/
├── main.py
├── utils.py
├── tests/
└── requirements.txt

图:main.py 负责入口,utils.py 放可复用逻辑,tests/ 验证行为,依赖文件记录运行环境。
第一个脚本只做一件事
在 main.py 中先实现最短路径,不急着引入框架:
from collections import Counter
from pathlib import Path
import re
import sys
def top_words(path: str, limit: int = 5):
text = Path(path).read_text(encoding="utf-8")
words = re.findall(r"[A-Za-z]+", text.lower())
return Counter(words).most_common(limit)
if __name__ == "__main__":
if len(sys.argv) != 2:
raise SystemExit("用法:python main.py <文本文件>")
for word, count in top_words(sys.argv[1]):
print(f"{word}: {count}")
运行时先准备一个 sample.txt,再执行:
python main.py sample.txt
这段命令我在当前环境只做了静态检查,未声称有固定输出;真实项目应把自己的输入和 Python 版本一并记录。遇到 FileNotFoundError,先检查当前目录和文件名,而不是马上修改代码。
为什么要尽早拆函数
当统计逻辑放进 top_words 后,命令行参数只是入口的一层壳。测试可以直接传入临时文件,后续也能把同一函数接到 Web 接口或批处理任务。
下一步可以为边界补测试:空文件、大小写混合、标点分隔,以及不存在的路径。测试不是额外仪式,它是在告诉自己“这段代码准备支持什么输入”。
从能运行到可复用,还差三件事
- 用虚拟环境隔离依赖,即使当前示例只使用标准库,也要养成项目隔离习惯。
- 把输入、输出和失败信号写进 README,别人才能复现。
- 每次只改一个点,改完重新运行同一组检查,避免把多个问题混在一起。
这条路径适合谁
如果你刚接触 Python,希望尽快建立“写代码—运行—验证”的反馈循环,这个小项目比一次性背完整语法更合适。它不替代数据结构、测试和工程化学习;当脚本开始处理大文件、并发任务或外部服务时,需要重新设计流式读取、日志和依赖管理。