第 06 章 · 三年级(小学五年级) 下学期

综合项目与阶段毕业

补齐工程能力:爬虫、正则、多线程、GUI、数据库、调试与代码规范,最后完成自主选题的大型毕业项目。

12 课时 15 个知识点 4 大易错点 3 档分层作业
一年级上一年级下二年级上二年级下三年级上三年级下四年级上四年级下五年级上五年级下六年级上六年级下七年级上七年级下
01

情景导航

用故事和生活类比打开这学期的大门,先「知其所以然」再学语法。

第一阶段的最后一学期,小强要从「会写程序」进化到「会做工程」:爬虫让程序自动上网拿数据,数据库让数据安家,GUI 让程序有脸面,调试与规范让代码能被别人读懂。最后的毕业项目,是他自己选题、自己设计、自己交付的第一个完整「作品」——第一阶段就此圆满。

💯生活类比:把新知识挂在旧经验上
🕷️

爬虫 = 图书馆借书员

按你的清单去书架(网页)取书,礼貌排队不吵不闹(限速)。

自动取数
🔍

正则 = 文字筛子

万字文本里一把筛出所有电话号码、邮箱、日期。

模式匹配
🗄️

数据库 = 仓库+管理员

存取有账本(SQL),查询有索引,百万数据秒回。

持久化
🐞

调试 = 法医破案

不靠猜,靠证据:断点、单步、看现场,锁定真凶。

定位 bug
核 心 口 诀requests取网页,BeautifulSoup择菜切;
regex一筛准定位,SQL一查数据来;
PEP8规范慢慢写,断点调试不抓瞎!
02

知识探究

综合项目与阶段毕业 —— 共 12 课时,全部知识点一网打尽。

🕷️数据获取(3 课时)
第1课网络爬虫入门
🎯 趣味项目:爬取天气信息📚 教学目标:掌握requests、BeautifulSoup,在项目实战中巩固运用
requestsBeautifulSoup
Python爬虫:抓取天气
import requests
from bs4 import BeautifulSoup

headers = {"User-Agent": "Mozilla/5.0"}    # 礼貌地报上身份
resp = requests.get(url, headers=headers, timeout=10)
resp.encoding = "utf-8"
soup = BeautifulSoup(resp.text, "html.parser")
for tag in soup.select(".weather"):        # CSS 选择器定位
    print(tag.get_text(strip=True))
运 行 结 果
晴 26℃ 东南风3级
多云 22℃ 微风
第2课爬虫进阶
🎯 趣味项目:豆瓣电影Top250📚 教学目标:掌握多页爬取、数据存储,在项目实战中巩固运用
多页爬取数据存储
Python爬虫进阶:翻页规律 + 持久化
import requests, csv, time
headers = {"User-Agent": "Mozilla/5.0"}
rows = []
for page in range(0, 2):                  # 翻页:start=0,25,50…
    url = "https://movie.example/top250"
    r = requests.get(url, params={"start": page * 25}, headers=headers, timeout=5)
    print(f"第{page+1}页 状态码 {r.status_code},长度 {len(r.text)}")
    time.sleep(1)                         # 礼貌限速,别把服务器打挂
    rows.append(["肖申克的救赎", 9.7])
with open("top250.csv", "w", newline="", encoding="utf-8") as f:
    csv.writer(f).writerows(rows)         # 存成 CSV
运 行 结 果
第1页 状态码 200,长度 48213
第2页 状态码 200,长度 47986
(top250.csv 已保存,可用 Excel 打开)
第3课正则表达式
🎯 趣味项目:文本信息提取📚 教学目标:掌握regex语法,在项目实战中巩固运用
regex语法
Python正则表达式:提取邮箱
import re
text = "联系我: xiaoqiang@py.com 或 teacher@school.cn"
emails = re.findall(r"[\w.]+@[\w.]+", text)
print("找到邮箱:", emails)
phones = re.findall(r"1\d{10}", "电话13812345678")
print("找到手机:", phones)
运 行 结 果
找到邮箱: ['xiaoqiang@py.com', 'teacher@school.cn']
找到手机: ['13812345678']
🧵并发与界面(2 课时)
第4课多线程
🎯 趣味项目:同时下载多张图片📚 教学目标:掌握threading,在项目实战中巩固运用
threading
Python多线程:并行下载
import threading

def download(name):
    print(f"开始下载 {name} ……")
    # ……下载代码……
    print(f"{name} 完成!")

ts = []
for i in range(3):                       # 开 3 条线程
    t = threading.Thread(target=download, args=(f"图{i}.png",))
    t.start(); ts.append(t)
for t in ts: t.join()                    # 等全部完成
运 行 结 果
开始下载 图0.png ……
开始下载 图1.png ……
开始下载 图2.png ……
(三个下载交替进行,总耗时≈最长的一个)
第5课GUI编程
🎯 趣味项目:记事本程序📚 教学目标:掌握tkinter,在项目实战中巩固运用
tkinter
PythonGUI 编程:第一个桌面程序
import tkinter as tk
win = tk.Tk()
win.title("我的记事本")
win.geometry("400x300")
txt = tk.Text(win, font=("simhei", 12))
txt.pack(fill="both", expand=True)
btn = tk.Button(win, text="保存",
                command=lambda: print("已保存", len(txt.get("1.0", "end")), "字符"))
btn.pack()
# win.mainloop()   # 事件循环:程序的心跳
print("窗口、文本框、按钮三件套已就绪")
运 行 结 果
窗口、文本框、按钮三件套已就绪
(点击「保存」→ 已保存 0 字符)
🗄️存储与工程素养(3 课时)
第6课数据库入门
🎯 趣味项目:图书管理系统📚 教学目标:掌握SQLite、SQL基础,在项目实战中巩固运用
SQLiteSQL基础
PythonSQLite:建表与查询
import sqlite3
conn = sqlite3.connect("library.db")
cur = conn.cursor()
cur.execute("""CREATE TABLE IF NOT EXISTS book(
    id INTEGER PRIMARY KEY,
    name TEXT, price REAL)""")
cur.execute("INSERT INTO book(name, price) VALUES(?, ?)", ("Python入门", 59.0))
conn.commit()
for row in cur.execute("SELECT name, price FROM book WHERE price > 50"):
    print(row)
运 行 结 果
('Python入门', 59.0)
第7课代码调试技巧
🎯 趣味项目:找Bug大作战📚 教学目标:掌握调试器、单元测试,在项目实战中巩固运用
调试器单元测试
Python代码调试技巧:pdb 三板斧
# 方法一:print 大法(快速但不优雅)
# 方法二:breakpoint() 进交互式调试
#   n = 下一行 / p 变量 = 打印 / c = 继续跑
# 方法三:单元测试,把 Bug 锁死
def divide(a, b):
    return a / b                    # 藏着 b=0 的雷

import unittest
class TestDivide(unittest.TestCase):
    def test_zero(self):
        with self.assertRaises(ZeroDivisionError):
            divide(1, 0)
print("用例设计:正常值 / 边界值 / 异常值")
运 行 结 果
用例设计:正常值 / 边界值 / 异常值
(跑 unittest 后 ZeroDivisionError 被测试捕获)
第8课代码规范
🎯 趣味项目:代码审查会📚 教学目标:掌握PEP8、注释规范,在项目实战中巩固运用
PEP8注释规范
Python代码规范:PEP8 速览
# PEP8 核心四条,写代码像写字一样工整
import os,sys            # ✗ 一行多个 import
import os
import sys               # ✓ 每个 import 独立一行

def f( a,b ):            # ✗ 括号里贴太紧
    x=1                   # ✗ 等号两边没空格
    return x

def add(a, b):           # ✓ 逗号后空格、运算符两侧空格
    total = a + b        # ✓ snake_case 命名、小写函数名
    return total         # ✓ 4 空格缩进
print("可读性 > 聪明,代码是写给人看的")
运 行 结 果
可读性 > 聪明,代码是写给人看的
(IDE 装 flake8 / black 可自动检查和格式化)
🎓毕业项目(4 课时)
🏆 毕业项目开发毕业项目开发
🎯 趣味项目:自主选题大型项目📚 教学目标:掌握项目管理、团队协作,在项目实战中巩固运用
项目管理团队协作
Python毕业项目:项目管理与分工
# 一个 12 课时毕业项目的典型拆解:
plan = {
    "第1-2课时": "选题 + 需求文档(做什么/给谁用)",
    "第3-5课时": "原型开发(先跑通主流程)",
    "第6-8课时": "功能迭代 + 互相 Code Review",
    "第9-10课时": "测试修 Bug(每人至少提 3 个 issue)",
    "第11-12课时": "演示彩排 + 答辩 PPT",
}
tools = "Git 分支开发 / 共享文档 / 每日站会 10 分钟"
for k, v in plan.items():
    print(f"{k}:{v}")
print("工具:", tools)
运 行 结 果
第1-2课时:选题 + 需求文档(做什么/给谁用)
第3-5课时:原型开发(先跑通主流程)
第6-8课时:功能迭代 + 互相 Code Review
第9-10课时:测试修 Bug(每人至少提 3 个 issue)
第11-12课时:演示彩排 + 答辩 PPT
工具: Git 分支开发 / 共享文档 / 每日站会 10 分钟
03

实践应用

每个知识点都要落到能跑、能玩、能演示的作品上。

🏆 期末项目自主选题大型项目

期末项目是整学期知识点的综合检验场:项目管理、团队协作。学生将独立完成需求拆解 → 功能实现 → 调试打磨 → 上台演示的完整闭环。

💡 验收标准:功能完整可运行、代码结构清晰、能给同学讲明白实现原理。
📊本学期课时一览表(可打印)
课次主题趣味项目知识点
1网络爬虫入门爬取天气信息requests、BeautifulSoup
2爬虫进阶豆瓣电影Top250多页爬取、数据存储
3正则表达式文本信息提取regex语法
4多线程同时下载多张图片threading
5GUI编程记事本程序tkinter
6数据库入门图书管理系统SQLite、SQL基础
7代码调试技巧找Bug大作战调试器、单元测试
8代码规范代码审查会PEP8、注释规范
9-12毕业项目开发自主选题大型项目项目管理、团队协作
04

总结提升

把一学期的知识点串成体系,看清来路与去向。

📌知识点体系图
🕷️ 数据获取
requestsBeautifulSoup多页爬取数据存储regex语法
🧵 并发与界面
threadingtkinter
🗄️ 存储与工程素养
SQLiteSQL基础调试器单元测试PEP8注释规范
🎓 毕业项目
项目管理团队协作
🔄承上启下

◀ 上一章:三年级 上学期 · 算法进阶与NOAI初赛备战

下一章 ▶:四年级 上学期 · 机器学习基础

💪 学完这学期,你将获得

补齐工程能力:爬虫、正则、多线程、GUI、数据库、调试与代码规范,最后完成自主选题的大型毕业项目。

结业时你将带走:3 个可玩游戏作品 + 一套算法思维 + NOAI 初赛参赛能力。

05

学习检测

避开高频易错点,再用速查表把语法焊进肌肉记忆。

易错点 1

爬虫没带请求头

✗ 错误写法
requests.get(url)
# 403 Forbidden
✓ 正确写法
requests.get(url,
  headers={"User-Agent": "Mozilla/5.0 …"})
💡 为什么:很多网站挡「裸奔」的请求,带上浏览器 UA 才放行。
易错点 2

正则贪婪匹配

✗ 错误写法
re.findall(r"<.*>", "<a>x</a><b>y</b>")
# 一口吞下整行
✓ 正确写法
re.findall(r"<.*?>", 同上)
# 逐个标签匹配
💡 为什么:量词后加 ? 变非贪婪,才不会「吃着碗里望着锅里」。
易错点 3

SQL 字符串拼接

✗ 错误写法
sql = f"SELECT * FROM t WHERE name='{name}'"
✓ 正确写法
cur.execute(
  "SELECT * FROM t WHERE name=?", (name,))
💡 为什么:拼接字符串有 SQL 注入风险,参数化查询是唯一正解。
易错点 4

调试全靠 print

✗ 错误写法
print(a)
print(a)
print(a)  # 疯狂插桩
✓ 正确写法
breakpoint()  # 交互式调试
💡 为什么:断点单步一次看清所有变量,比 print 大法优雅一百倍。
📋语法速查表
功能写法一句话理解
发请求requests.get(url, headers=h)取回网页/接口内容
解析网页soup.select("div.title")CSS 选择器定位元素
正则提取re.findall(r"\d{11}", s)筛出 11 位手机号
开线程threading.Thread(target=下载, args=(url,))多张图片同时下载
建表cur.execute("CREATE TABLE book …")给数据安家
查询SELECT * FROM book WHERE price > 50条件取数
调试breakpoint() / 单步 n / 看 p 变量pdb 三板斧
规范PEP8:4空格缩进、蛇形命名、行宽≤79代码像印刷体一样整洁
分 层 作 业

练习作业

按 A / B / C 三档难度自主选择:保底完成 A 组,学有余力挑战 B、C 组。

A组·基础任选其一深入完成
  1. 爬取天气网站,打印今明两天温度。
  2. 从一篇新闻里提取所有邮箱和日期。
  3. 用 tkinter 做一个带保存按钮的记事本。
B组·提高任选其一深入完成
  1. 爬取豆瓣电影 Top250 存成 CSV(注意限速)。
  2. 图书管理系统:SQLite 存书,支持借还状态。
  3. 多线程批量下载 20 张图片,对比单线程耗时。
C组·挑战任选其一深入完成
  1. 毕业项目:自主选题,需求文档 + 代码 + 演示三件套。
  2. 给项目的 3 个核心函数写单元测试。
  3. 和同学互相 code review,提交审查清单。