经常会有读者在评论区问我:Python 基础语法已经过了一遍,循环、函数、列表、字典也都能看懂,但一到自己动手就不知道从哪里入手。还有人干脆把“Python 安装好了”当成“已经学会 Python 了”,然后刷了半个月视频,代码却没写过几行。
这个问题的根源,往往不是智商,也不是数学基础,而是学习方式出了问题。只看语法不做项目,就像只看菜谱不下厨房,永远体会不到“盐放多了怎么救”“火开大了怎么关”的真实手感。
本文整理了 80 个 Python 实战项目,按“入门基础 — 办公自动化 — 爬虫 — Web 框架 — 工具自动化 — 数据分析与AI入门”六个阶段分类。每一个项目都标出了推荐练习的核心知识点。你不需要一次性做完 80 个,而是可以在不同学习阶段按需选取,真正把学过的语法变成能运行、能演示、能写进简历的成果。
为了不让文章变成干巴巴的项目列表,我还会从清单里挑出 3 个具有代表性的项目,给出完整代码和运行过程,并在最后补充高频报错、调试思路和工程规范。无论你是零基础入门,还是想从脚本开发过渡到后端或者爬虫方向,这篇内容都能帮你把学习路线重新捋顺一遍。
1. 为什么“项目驱动”是 Python 进阶最快的方式
1.1 只刷语法和做项目,差距到底在哪里
语法学习是“输入”,项目练习是“输出”。
只刷语法时,你看到的是一个个孤立的知识点:for循环怎么用、dict怎么取值、requests.get()怎么发请求。这些知识点本身不难,但如果你从不把它们组合起来,遇到真实问题仍然会卡住。
举个例子。很多初学者学过文件读写,知道open()和with,但当需要写一个“通讯录管理系统”,要同时处理添加、查找、删除、保存时,才发现自己根本没有“把数据组织起来”的能力。项目练习逼着你去面对这种组合性问题,它比背语法更能提升真实的编码能力。
另外,项目的最大价值在于可见的反馈。你写完一个猜数字程序,运行后它能和你互动;你写完一个爬虫脚本,运行后能看到一条条真实数据被保存下来。这种正反馈会不断强化学习动力,也会让你很快意识到代码哪里有问题、算法哪里需要改。
1.2 80 个项目如何分阶段练习
本文把 80 个项目分成 6 个阶段,不代表你必须按顺序从第 1 个做到第 80 个。分成阶段的目的,是为了让你根据当前水平选择最合适的目标:
- 第 1 阶段:适合刚学完 Python 基础语法的读者,重点巩固循环、函数、文件读写、面向对象等基础能力。
- 第 2 阶段:适合想做办公自动化的读者,重点掌握
os、Path、pandas、docx、openpyxl等常用库。 - 第 3 阶段:适合对爬虫方向感兴趣的读者,前提是明确合规边界,只接触公开数据和个人学习场景。
- 第 4 阶段:适合想往后端开发发展的读者,建议至少完整做完一个 Web API 项目。
- 第 5 阶段:适合已经写了不少脚本、想提升工程效率的读者。
- 第 6 阶段:适合想进入数据分析或人工智能方向的读者,从 pandas、matplotlib 再到 PyTorch 按难度递进。
我更推荐的做法是:在每个阶段选择 2~3 个项目完整做完,比快速浏览 20 个不写代码的项目有效得多。
1.3 面试官到底想从项目里看到什么
“练完即可就业”这个说法容易让人误解。能保证就业的从来不是“做过项目的数量”,而是你解决问题的能力和对代码的理解深度。
面试官看一个 Python 岗位候选人的项目时,通常会关注几个点:
- 项目是否是个人独立完成,技术栈是否真实掌握。
- 代码结构是否清晰,有没有函数拆分、异常处理、日志输出。
- 遇到没有预料到的输入时,程序会不会崩溃。
- 项目中是否包含数据库、文件存储、外部接口等真实工程场景。
- 候选人能不能讲清楚“为什么用这个方案”,而不只是“这段代码能跑”。
所以本文最后会专门用一节讲工程最佳实践。你现在做的每一个小项目,都可以按照这些标准去打磨,让它们从“课堂练习”变成“作品集”。
2. Python 开发环境准备
在打开项目清单之前,先把环境准备好。环境不顺手,后面写每个项目都会难受。
2.1 Python 版本选择与安装
目前主流教程大多使用 Python 3.9 以上版本。建议安装 Python 3.10 或更高版本,但不必追求最新的 3.13。很多第三方库要经过一段时间才会对最新版本做完整适配,选择比最新版低一个大版本通常最稳定。
在 Windows 上安装时,务必勾选 “Add Python to PATH”,否则后面在命令行执行python会提示找不到命令。
安装完成后,打开终端或命令行工具,验证版本:
python --version pip --version如果使用的是 macOS 或 Linux,可能需要使用python3和pip3:
python3 --version pip3 --version只要能看到类似Python 3.11.x的输出,就说明解释器已经安装成功。
2.2 开发工具推荐
初学者建议选择 VSCode 或 PyCharm。
VSCode 更轻量,安装 Python 扩展后,可以实现代码提示、断点调试、Jupyter Notebook 等能力。使用 VSCode 时有几个容易踩坑的地方,后面第 7 节会专门说明。
PyCharm 社区版是免费的,对 Python 项目结构支持更完整,适合习惯“打开即用”的人。它的缺点是启动较慢,机器配置偏低时会有明显卡顿。
工具本身不影响技术能力。关键是你要能完成三件事:新建 Python 文件、运行脚本、看到报错信息并定位行号。
2.3 使用虚拟环境隔离项目依赖
Python 项目的依赖管理是最容易忽略的一环。今天装requests,明天装scrapy,如果把所有包都装到全局环境,一段时间后项目之间就会互相影响。
建议每个项目都创建独立虚拟环境:
python -m venv venv在 Windows 中激活虚拟环境:
venv\Scripts\activate在 macOS / Linux 中激活虚拟环境:
source venv/bin/activate激活成功后,命令行前面会出现(venv)标识。之后执行:
pip install requests再生成依赖清单:
pip freeze > requirements.txt别人拿到你的项目后,只需要执行:
pip install -r requirements.txt就能复现环境,这也是项目交付的基本规范。
3. 80 个 Python 实战项目全景清单
下面按 6 个阶段列出全部 80 个项目。每个表格里的项目顺序,大致按照难度从低到高排列。你可以把本页加入收藏,后续学完一个阶段再回头来选下一个项目。
3.1 第一阶段:Python 基础语法项目(01~15)
这一阶段的目标不是“炫技”,而是把条件判断、循环、函数、字符串、列表、字典、文件读写、异常处理等基础能力练扎实。
不建议直接跳到爬虫或 Web 框架。基础不牢,后面前后端联调、数据清洗、框架报错会消耗你大量本来可以用于学习核心逻辑的时间。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 01 | 猜数字小游戏 | random、while、条件判断 |
| 02 | 九九乘法表打印 | 双层循环、格式化输出 |
| 03 | 简易命令行计算器 | 函数定义、异常处理、正则 |
| 04 | 石头剪刀布 | 随机数、字典映射、逻辑判断 |
| 05 | 随机密码生成器 | random、字符串处理、参数设计 |
| 06 | 文字冒险游戏 | 流程控制、函数拆分、事件状态 |
| 07 | 学生成绩管理系统 | 列表与字典组合、排序、统计 |
| 08 | 通讯录管理系统 | 函数模块化、文件读写、JSON 持久化 |
| 09 | 待办事项管理器 | 增删改查、日期处理、数据保存 |
| 10 | 个人日记本 | 文件操作、时间戳、文本加密入门 |
| 11 | 命令行 2048 游戏 | 二维列表、游戏逻辑、终端渲染 |
| 12 | 生日提醒器 | datetime、列表筛选、定时概念 |
| 13 | 简单图书馆借阅系统 | 类与对象、对象列表管理 |
| 14 | Markdown 转 HTML 工具 | 正则、文本解析、模块设计 |
| 15 | 命令行贪吃蛇(可选 Pygame) | 面向对象、队列思想、事件循环 |
你可以从 01~05 中任选一个,作为“第一个完整运行的小程序”。之后建议把 08 号通讯录管理系统完整做完,因为它是很多数据库项目和 Web 项目的雏形。
3.2 第二阶段:文件处理与办公自动化项目(16~30)
Python 被广泛应用于办公自动化的原因很简单:它擅长处理大量重复、机械的文件操作。这个阶段的项目,会让你在不知不觉中掌握pathlib、os、openpyxl、python-docx、PyPDF2、Pillow等高频库。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 16 | Excel 多表数据合并 | openpyxl/pandas、表头匹配 |
| 17 | CSV 数据筛选与统计 | csv、条件过滤、聚合 |
| 18 | Word 通知单批量生成 | python-docx、模板替换 |
| 19 | PDF 合并与拆分 | PyPDF2/pypdf、文件遍历 |
| 20 | PDF 文本批量提取 | PDF 解析、批量导出 |
| 21 | 图片批量压缩与格式转换 | Pillow、目录遍历 |
| 22 | 图片文字识别小工具 | pytesseract、OCR 基础 |
| 23 | Excel 报表自动生成 | pandas、数据透视、图表 |
| 24 | 文件监控与自动归类 | watchdog、事件监听 |
| 25 | 邮件定时提醒助手 | smtplib、schedule定时任务 |
| 26 | 日志文件关键字告警 | 文本读取、正则匹配、通知推送 |
| 27 | 批量文件编码转换 | chardet、编码检测、批量写入 |
| 28 | 网页长文导出 Markdown | 解析 HTML、Markdown 转换 |
| 29 | 批量二维码生成器 | qrcode、GUI 或命令行参数 |
| 30 | 文件夹自动备份脚本 | shutil、压缩、增量备份思路 |
办公自动化项目最大的特点是“能做实事”。做完之后,你可以直接用它帮家人、同学或同事解决一个真实问题。这种“被需要感”也是坚持学习的重要动力。
3.3 第三阶段:Python 爬虫项目(31~45)
在本节开始前,必须先说清楚合规底线。
爬虫技术本身是中立工具,但在练习时要注意几点:
- 只爬取公开信息,并且遵守目标网站的
robots.txt规则。 - 明确区分“个人学习”和“商业用途”。不要将采集到的数据用于商业牟利。
- 控制请求频率,不要对目标服务器造成压力。
- 不要追求破解验证码、绕登录、突破风控等灰色技能。这类内容与正规就业的核心能力关联不大,反而容易让你走上错误的路。
真正的爬虫岗位或数据采集能力,看重的其实是请求设计、错误重试、数据清洗、去重入库、定时调度、任务监控等工程能力。下面这些项目都围绕这些能力展开。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 31 | 静态网页文章采集 | requests、BeautifulSoup、选择器 |
| 32 | 分页列表数据采集 | 翻页 URL 规律、循环请求 |
| 33 | 天气接口 JSON 解析 | requests.get()、JSON 解析 |
| 34 | RSS 订阅源聚合 | feedparser、多源聚合 |
| 35 | 网页表格数据转 Excel | HTML 表格解析、结构化存储 |
| 36 | JSON 数据清洗与去重入库 | 数据去重、集合、SQLite 存储 |
| 37 | CSV 批量数据回填 | 批量请求公开接口、更新本地文件 |
| 38 | Scrapy 新闻采集框架项目 | Scrapy 项目结构、Spider 编写 |
| 39 | Scrapy 管道数据存储 | Item Pipeline、MySQL 或 SQLite 存储 |
| 40 | 请求失败自动重试脚本 | 超时处理、指数退避重试 |
| 41 | 数据定时增量更新 | schedule/ Cron 思路、增量判断 |
| 42 | 请求头与 Cookie 基础设置 | Headers、Session、免登录场景 |
| 43 | 请求频率控制与限速 | 延时、随机等待、滑动窗口 |
| 44 | 并发采集公开接口数据 | concurrent.futures、线程池 |
| 45 | 采集结果可视化报表 | matplotlib或pyecharts、汇总展示 |
如果把这个阶段的目标浓缩成一句话:不是“能抓到”,而是“抓得稳、存得好、不添乱”。
3.4 第四阶段:Web 开发与框架项目(46~60)
如果你想往后端开发方向走,至少需要完成一个 Web API 项目和一个带数据库的完整 Web 项目。在这 15 个项目中,Flask、FastAPI、Django 是三条主流路线。
Django 内置功能全面,适合传统业务系统、内容管理后台;Flask 轻量灵活,适合个人博客和小型服务;FastAPI 性能好、自动生成接口文档,适合前后端分离项目。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 46 | Flask 待办事项 API | 路由、请求与响应、JSON |
| 47 | Flask 文章发布后台 | 表单处理、模板渲染、数据库 |
| 48 | Flask 登录注册与会话 | Session、密码哈希、用户校验 |
| 49 | Flask + MySQL 信息管理系统 | SQLAlchemy、ORM、CRUD |
| 50 | FastAPI 通讯录管理接口 | Pydantic 模型、路径参数、接口文档 |
| 51 | FastAPI + SQLite CRUD | 数据库连接、增删改查 |
| 52 | FastAPI 文件上传下载服务 | 文件流、异步 IO |
| 53 | FastAPI 定时统计任务 | 后台任务、定时聚合 |
| 54 | FastAPI 接口权限校验 | 依赖注入、Token 校验 |
| 55 | Django 投票应用 | MTV 模式、模型与视图 |
| 56 | Django 个人博客后台 | Admin 管理、文章分类、评论 |
| 57 | Django 用户与权限模块 | 权限分组、装饰器、登录中间件 |
| 58 | FastAPI + Redis 热点缓存 | Redis 读写、缓存更新策略 |
| 59 | Flask + Vue 前后端分离项目 | CORS、接口联调、部署方式 |
| 60 | 在线备忘录 Web 应用 | 完整前后端、部署实践 |
其中 50 号“FastAPI 通讯录管理接口”很适合作为第一个后端接口项目。它的数据模型清晰、接口语义直观,完整代码在本文第 5 节会给出。
3.5 第五阶段:自动化与效率工具项目(61~70)
这类项目不一定“高大上”,但对提升工作流效率特别有用。把它们部署到自己的电脑上,每天使用,你才能真正理解一个工具从“能用”到“好用”需要经过哪些迭代。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 61 | 桌面定时弹窗提醒 | GUI 编程、定时任务 |
| 62 | 剪贴板历史增强工具 | 剪贴板监听、数据存储 |
| 63 | 本地文件自动备份 | 目录同步、执行日志 |
| 64 | 系统健康巡检报告 | psutil、CPU/内存/磁盘采集 |
| 65 | 钉钉 / 企业微信机器人告警 | Webhook、消息推送 |
| 66 | RPA 办公自动填录 | GUI 自动化、表格识别 |
| 67 | Git 提交日志统计工具 | 系统命令调用、解析、报表 |
| 68 | 局域网文件互传工具 | Socket、HTTP 服务、UI 设计 |
| 69 | 定时截图与留存脚本 | Pillow、自动化任务 |
| 70 | 自定义命令行脚手架 | argparse、工程化目录生成 |
这类项目做完后,你会慢慢发现:很多工具的本质都是“输入数据、处理逻辑、输出结果”。对工程师来说,发现问题并能写脚本解决,本身就是一项稀缺能力。
3.6 第六阶段:数据分析与人工智能入门项目(71~80)
这一阶段的技术栈覆盖了pandas、numpy、matplotlib、scikit-learn、PyTorch等。难度比前面明显提升,不再建议零基础读者一上来就做,应该先完成至少前两个阶段的 3~4 个项目再进入本节。
| 编号 | 项目名称 | 核心知识点 |
|---|---|---|
| 71 | Pandas 销售数据清洗与分析 | DataFrame 筛选、缺失值处理 |
| 72 | 电商订单明细分析 | 多表关联、分组聚合 |
| 73 | Matplotlib 多维度可视化报表 | 折线图、柱状图、饼图布局 |
| 74 | NumPy 数组与矩阵运算 | 广播机制、性能对比 |
| 75 | 客户流失预测入门 | scikit-learn、逻辑回归、评估指标 |
| 76 | 垃圾短信分类 | 文本向量化、朴素贝叶斯 |
| 77 | 房价回归预测项目 | 特征处理、线性回归、误差评估 |
| 78 | MNIST 手写数字识别 | PyTorch、torchvision、卷积神经网络入门 |
| 79 | 股票价格趋势分析与展示 | 金融数据接口、时间序列、技术指标计算 |
| 80 | 大模型接口问答应用封装 | 大模型开放 API、提示词工程、对话流封装 |
第 80 个项目的关键是强调“官方 API 合法调用”,不要涉及任何越权、破解或隐私数据。如今很多 Python 工程师都在做 AI 应用层开发,核心能力是把大模型接口封装成稳定可用的业务服务。
4. 实战案例一:Python 基础项目——通讯录管理系统
在 80 个项目中,08 号“通讯录管理系统”非常适合作为第一个完整项目。它不大不小,刚好能把“函数拆解、数据存储、异常处理”串联起来。
4.1 需求分析
这个系统最少需要完成:
- 添加联系人。
- 查看所有联系人。
- 根据姓名搜索联系人。
- 删除联系人。
- 数据保存到本地 JSON 文件。
- 程序再次启动时自动加载数据。
你也可以在此基础上扩展“编辑联系人”“导出 CSV”“支持分组”等功能,但这里先实现核心部分。
4.2 完整代码实现
# 文件路径:contacts_demo/contacts.py import json import os DATA_FILE = "contacts.json" def load_contacts(): """从 JSON 文件加载联系人列表""" if not os.path.exists(DATA_FILE): return [] try: with open(DATA_FILE, "r", encoding="utf-8") as f: return json.load(f) except json.JSONDecodeError: print("数据文件损坏,已备份后重新初始化") os.rename(DATA_FILE, DATA_FILE + ".bak") return [] def save_contacts(contacts): """把联系人列表保存到 JSON 文件""" with open(DATA_FILE, "w", encoding="utf-8") as f: json.dump(contacts, f, ensure_ascii=False, indent=2) def add_contact(contacts): """新增联系人""" name = input("请输入姓名:").strip() phone = input("请输入手机号:").strip() if not name or not phone: print("姓名和手机号不能为空") return contacts # 简单检查手机号是否已存在 for c in contacts: if c["phone"] == phone: print("该手机号已存在,添加失败") return contacts contacts.append({"name": name, "phone": phone}) save_contacts(contacts) print("添加成功") return contacts def show_all(contacts): """展示所有联系人""" if not contacts: print("当前没有联系人") return print("===== 联系人列表 =====") for index, c in enumerate(contacts, start=1): print(f"{index}. {c['name']} - {c['phone']}") def search_contact(contacts): """按姓名搜索联系人""" keyword = input("请输入要搜索的姓名:").strip() result = [c for c in contacts if keyword in c["name"]] if result: for c in result: print(f"姓名:{c['name']},手机号:{c['phone']}") else: print("没有找到匹配的联系人") def delete_contact(contacts): """删除联系人""" show_all(contacts) if not contacts: return contacts try: number = int(input("请输入要删除的序号:")) if number < 1 or number > len(contacts): print("序号越界") return contacts contacts.pop(number - 1) save_contacts(contacts) print("删除成功") except ValueError: print("请输入有效数字") return contacts def main(): contacts = load_contacts() while True: print("\n===== 通讯录管理系统 =====") print("1. 添加联系人") print("2. 查看所有联系人") print("3. 搜索联系人") print("4. 删除联系人") print("5. 退出") choice = input("请输入功能编号:").strip() if choice == "1": contacts = add_contact(contacts) elif choice == "2": show_all(contacts) elif choice == "3": search_contact(contacts) elif choice == "4": contacts = delete_contact(contacts) elif choice == "5": print("已退出系统") break else: print("无效编号,请重新输入") if __name__ == "__main__": main()4.3 运行与验证
在项目目录执行:
python contacts.py预期交互效果:
===== 通讯录管理系统 ===== 1. 添加联系人 2. 查看所有联系人 3. 搜索联系人 4. 删除联系人 5. 退出 请输入功能编号:1 请输入姓名:张三 请输入手机号:13800001111 添加成功再次运行程序,之前添加的联系人依然存在,这是因为数据已经通过save_contacts()写入contacts.json。
这个项目虽然简单,却包含了一个真实软件的基础流程:用户输入 → 业务处理 → 数据持久化 → 下次启动恢复。后续学习 FastAPI 或数据库时,你会发现逻辑结构有很多相似之处。
5. 实战案例二:办公自动化——文件批量整理工具(编号 24)
很多程序员电脑里的“下载”文件夹能有两三年没清理,里面密密麻麻全是 PDF、图片、安装包、压缩包。这类问题非常适合用脚本解决。
5.1 项目功能设计
遍历一个指定目录,按照文件后缀自动分类到不同子目录:
- 图片:jpg、png、gif、webp
- 文档:doc、docx、pdf、txt、md
- 表格:xls、xlsx、csv
- 压缩包:zip、rar、7z、tar、gz
- 代码:py、java、js、html、css
程序默认只输出移动预览,避免误操作。当确认结果无误后,再执行真正的移动。
5.2 完整代码实现
# 文件路径:file_organizer/organize.py import argparse from pathlib import Path import shutil CATEGORY_RULES = { "图片": {".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"}, "文档": {".doc", ".docx", ".pdf", ".txt", ".md"}, "表格": {".xls", ".xlsx", ".csv"}, "压缩包": {".zip", ".rar", ".7z", ".tar", ".gz"}, "代码": {".py", ".java", ".js", ".ts", ".html", ".css", ".go"}, "安装包": {".exe", ".msi", ".dmg", ".pkg"}, } def classify(file_path: Path): """根据后缀返回所属分类""" suffix = file_path.suffix.lower() for category, suffix_set in CATEGORY_RULES.items(): if suffix in suffix_set: return category return "其他" def organize(directory: Path, dry_run: bool = True): """整理目录中的文件""" if not directory.exists(): print(f"目录不存在:{directory}") return for file_path in directory.iterdir(): # 跳过子目录,只看文件 if not file_path.is_file(): continue category = classify(file_path) target_dir = directory / category target_path = target_dir / file_path.name if dry_run: print(f"[预览] {file_path.name} -> {category}/") continue # 创建目标目录并移动文件 target_dir.mkdir(exist_ok=True) # 如果目标目录已有同名文件,加前缀避免覆盖 if target_path.exists(): target_path = target_dir / f"{file_path.stem}_副本{file_path.suffix}" shutil.move(str(file_path), str(target_path)) print(f"[完成] {file_path.name} -> {category}/") def main(): parser = argparse.ArgumentParser(description="按文件类型自动归类工具") parser.add_argument("directory", type=str, help="需要整理的目录路径") parser.add_argument("--execute", action="store_true", help="真正执行移动,默认只预览") args = parser.parse_args() source_dir = Path(args.directory) # 默认 dry_run=True,只有加 --execute 才会执行移动 organize(source_dir, dry_run=not args.execute) if __name__ == "__main__": main()5.3 运行与验证
先预览效果,不加--execute:
python organize.py D:\Downloads输出类似:
[预览] 项目文档.pdf -> 文档/ [预览] 截图.png -> 图片/ [预览] 学习笔记.md -> 文档/ [预览] 源码.zip -> 压缩包/确认结果合理后,再执行正式移动:
python organize.py D:\Downloads --execute这个设计背后的思路非常重要:凡是涉及文件、数据库、配置变更的操作,都应该默认提供“预览模式”或“回滚计划”,而不是直接执行破坏性操作。这也是生产环境里的安全习惯。
6. 实战案例三:FastAPI 通讯录管理接口(编号 50)
如果你往后端开发方向发展,FastAPI 是非常适合作为起点的一个框架。它代码量少、类型提示清晰、自动生成接口文档,写完后浏览器直接打开就能测试。
6.1 创建项目结构
contact-api/ ├── main.py ├── requirements.txt └── venv/6.2 编写完整接口
# 文件路径:contact-api/main.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI(title="通讯录 API 项目示例") # 为便于演示,这里使用内存列表; # 学习阶段可以换成 MySQL 或 Redis contacts = [] id_counter = 1 class ContactIn(BaseModel): """新增联系人时接收的请求体""" name: str phone: str class Contact(ContactIn): id: int @app.post("/contacts", response_model=Contact) def create_contact(item: ContactIn): """新增联系人""" global id_counter if not item.name or not item.phone: raise HTTPException(status_code=400, detail="姓名和手机号不能为空") # 演示项目不做手机号格式深度校验 new_contact = { "id": id_counter, "name": item.name, "phone": item.phone, } contacts.append(new_contact) id_counter += 1 return new_contact @app.get("/contacts") def list_contacts(): """查询联系人列表""" return contacts @app.get("/contacts/{contact_id}") def get_contact(contact_id: int): """根据 id 查询联系人""" for c in contacts: if c["id"] == contact_id: return c raise HTTPException(status_code=404, detail="联系人不存在") @app.delete("/contacts/{contact_id}") def delete_contact(contact_id: int): """根据 id 删除联系人""" for idx, c in enumerate(contacts): if c["id"] == contact_id: contacts.pop(idx) return {"message": "删除成功"} raise HTTPException(status_code=404, detail="联系人不存在")6.3 运行与验证
在虚拟环境中安装依赖:
pip install fastapi uvicorn启动服务:
uvicorn main:app --reload运行成功后,终端会显示服务地址:http://127.0.0.1:8000。
打开浏览器访问:
http://127.0.0.1:8000/docs你会看到 FastAPI 自动生成的 Swagger 接口文档。可以在页面上直接测试新增联系人、查询列表、删除联系人等操作。
也可以在命令行中测试:
curl -X POST "http://127.0.0.1:8000/contacts" -H "Content-Type: application/json" -d "{\"name\":\"李四\",\"phone\":\"13900002222\"}"预期返回:
{ "id": 1, "name": "李四", "phone": "13900002222" }做完这个项目后,你可以继续加上 SQLite 存储、Token 鉴权、异常处理中间件等能力,让它更接近一个真实的后端服务。
7. 常见问题与排查思路
项目写得越多,遇到的报错也越多。很多报错不是你能力不行,而是问题定位方法不对。下面是 Python 实战项目中最常见的一些问题。
7.1 高频问题一览
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
python不是内部或外部命令 | 安装 Python 时未勾选 PATH | 重装 Python 并勾选 Add Python to PATH |
pip安装第三方库超时 | 网络到默认源不稳定 | 使用国内镜像源安装,例如清华或阿里云镜像 |
ModuleNotFoundError: No module named 'requests' | 当前环境没有安装对应库 | 先激活虚拟环境,再执行pip install requests |
| 在 VSCode 里运行代码报找不到模块 | 选择了错误的 Python 解释器 | 按Ctrl+Shift+P,选择当前项目的venv解释器 |
运行后只显示exit code 0,但没有输出 | 文件保存为空,或代码路径未执行 | 检查文件是否包含print调用,主入口是否用main()包裹 |
| 读取中文字符串乱码 | 文件编码不是 UTF-8 | 用encoding="utf-8"打开文件,并确认源码首行保存为 UTF-8 |
| 爬虫抓不到页面内容 | 目标页面动态渲染或返回非预期页面结构 | 先保存 HTML 到本地,检查选择器是否匹配 |
| 爬虫被目标服务器限制 | 请求过于频繁或请求头不完整 | 降低请求频率,补充 User-Agent,遵守网站规则 |
7.2 一个万能排错顺序
遇到任何问题,不要急着改代码。先按下面顺序排查:
- 看报错第一行的异常类型,例如
NameError、TypeError、FileNotFoundError。 - 看最后一行提示的具体文件和行号。
- 在代码里临时加
print(),输出中间变量,确认数据是否符合预期。 - 把代码片段复制到搜索引擎时,只复制报错的核心部分,不要复制整个文件。
- 解决后,记录到自己的 bug 文档中,避免下次重复踩坑。
7.3 为什么“程序正常运行但没有输出”
很多初学者在 VSCode 或 PyCharm 里新建了一个空文件,随手写了几个函数,然后点击运行,看到终端提示exit code 0,却没有输出,就以为程序出问题了。
其实这只说明程序执行成功,但没有执行任何打印操作。Python 不会自动调用你定义的函数。如果你写了:
def add(a, b): return a + b程序本身不会输出任何内容。你需要主动调用它:
print(add(2, 3))还有一种情况是代码缩进有问题。比如main()没有写在if __name__ == "__main__":下面,导致入口代码没有执行。这个细节在初学者代码里很常见。
8. Python 项目工程化最佳实践
当你能写出一个可以运行的小项目时,下一步要思考的是:怎么写才能便于阅读、调试、扩展?
8.1 代码结构不要“一把梭”
新手写项目经常把所有逻辑都堆在一个main.py文件里。项目到 200 行还能忍,到 2000 行时根本无法维护。
推荐至少按“输入、处理、存储”的思路拆分函数:
project/ ├── main.py # 启动入口 ├── utils.py # 公共函数 ├── data/ # 数据文件 ├── output/ # 输出目录 └── requirements.txt # 依赖清单函数命名也要见名知意。比如fetch_weather()、save_to_json(),而不是func1()、get()。
8.2 异常处理要区分“保护”与“吞错”
很多初学者喜欢这样写:
try: result = 1 / 0 except Exception: pass这样程序不会报错,但同时也会把真正的问题掩盖掉。更好的做法是打印当前错误信息:
try: result = 1 / 0 except ZeroDivisionError as e: print(f"计算失败:{e}")生产项目里的原则是:该抛出的异常要抛出,该记录的日志要记录。只捕获你预期会出现的异常类型,不要轻易捕获所有Exception后静默处理。
8.3 日志比 print 更可靠
临时调试可以用print(),但服务型项目建议用标准库logging:
import logging logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s", ) logging.info("服务启动成功") logging.error("请求失败,重试第 3 次")这样可以用开关控制日志级别,也方便后续收集到文件中。
8.4 从第一个项目开始就使用 Git
哪怕只是自己练习,也建议从第一天就使用 Git:
git init git add . git commit -m "完成通讯录管理系统第一版"每次改动一个小功能后就提交一次。当你把代码改坏时,你就能通过提交历史找回之前的可用版本。这个习惯比任何教程都实用。
8.5 项目做完后写一小段 README
很多练习项目就一张代码文件,别人根本不知道该怎么运行。建议在每个项目目录下创建一个README.md,内容不需要长,但必须包含:
- 项目功能简介。
- 运行环境。
- 安装依赖命令。
- 启动命令。
- 目录结构说明。
一份清晰的 README,会让你在面试翻项目时逻辑顺畅,也能体现你的工程意识。
8.6 合规意识要刻在习惯里
爬虫项目里最容易出问题的是数据来源。在训练时,优先选择:
- 官方提供的 Open API。
- 不需要登录即可访问的静态公开页面。
- 目标网站明确允许采集的开放数据。
不要在项目中使用任何需要破解验证码、绕过登录、突破风控的方式,也不要拿采集到的数据用于商业销售。数据安全是一个工程师的基本红线。
9. 总结与下一步建议
这份 80 个 Python 实战项目清单,本质上不是“算法题库”,而是一条帮你把知识点串成能力的学习路径。前台基础项目练语法,办公自动化项目练文件处理,爬虫项目练数据采集,Web 框架项目练后端服务,数据分析项目练业务分析,AI 项目练模型应用。
下一步,建议你不要试图一口气做完 80 个。可以从今天开始,先选一个最简单、最感兴趣的项目动手。比如还在犹豫的话,就先完成 08 号通讯录管理系统,把代码运行起来,再尝试给它加上“分组管理”或“CSV 导出”功能。
项目数量本身只是表,真正值钱的是你在反复调试中形成的思维方式和代码手感。把第一个项目完整做出来、记录清楚、提交到 Git,后面每一个新项目都会越来越快。
如果这篇文章对你有帮助,可以收藏备用。等你做完一个阶段的项目,欢迎回来再对照清单,选下一个适合你的实战目标。