01 / MINES八颗雷
按教学周排列,难度递进
第 1–7 颗是「会报错的雷」,第 8 颗是不报错的雷——最难缠的那种。每颗雷都对应速查表里的一行。
E1 · 第 2 周定义之前就用NameError
# welcome.py · 第 1 行就炸 print(welcome) welcome = "欢迎来到词频统计"
哪里炸?什么病?怎么修?
展开答案
报错:
NameError: name 'welcome' is not defined。诊断:Python 从上往下执行,第 1 行时 welcome 还不存在。修法:两行调换顺序。教学点:报错行号指的是「出事的地方」,不一定是「改的地方」。E2 · 第 2 周字符串加了 1TypeError
# age.py age = input("你的年龄:") next_year = age + 1 print("明年你", next_year, "岁")
哪里炸?什么病?怎么修?
展开答案
报错:
TypeError: can only concatenate str (not "int") to str。诊断:input 的返回永远是字符串,字符串不能加整数。修法:age = int(input("你的年龄:"))。教学点:从这颗雷起,学生见到 input 就条件反射套 int()。E3 · 第 3 周冒号后面顶格了IndentationError
# echo.py scores = [90, 85, 77] for s in scores: print(s)
哪里炸?什么病?怎么修?
展开答案
报错:
IndentationError: expected an indented block。诊断:冒号后的循环体忘了缩进——这是「语法期」病,程序根本没跑起来。修法:print 缩进 4 格。E4 · 第 3 周多走了一步IndexError
# roll.py names = ["林可为", "赵一鸣", "周小满"] for i in range(len(names) + 1): print(i, names[i])
哪里炸?什么病?怎么修?
展开答案
报错:
IndexError: list index out of range。诊断:range(len+1) 多走一步,names[3] 不存在——len 和下标差一。修法:去掉 + 1,或直接 for i, name in enumerate(names)。E5 · 第 4 周空名单求平均ZeroDivisionError
# avg.py · 今天交作业的名单还是空的 scores = [] total = sum(scores) avg = total / len(scores) print("班级平均分:", avg)
哪里炸?什么病?怎么修?
展开答案
报错:
ZeroDivisionError: division by zero。诊断:这就是 PAPER 01 里 grades.py 那颗雷的完整版——先问数据:len(scores) 为什么是 0。修法:除之前先判空:if len(scores) == 0: print("今天没人交作业")。E6 · 第 4 周int 不认识这个ValueError
# score.py · 学生输入了「九十分」 raw = input("输入分数:") score = int(raw)
哪里炸?什么病?怎么修?
展开答案
报错:
ValueError: invalid literal for int() with base 10: '九十分'。诊断:类型对(字符串),内容不认——int 只认 '90',不认 '九十分'。修法:先 raw.isdigit() 判断再转,或 try/except(第 9 周教)。教学点:区分 TypeError 与 ValueError:类型错 vs 内容错。E7 · 第 5 周文件不在家FileNotFoundError
# load.py f = open("data/students.csv", encoding="utf-8")
哪里炸?什么病?怎么修?
展开答案
报错:
FileNotFoundError: [Errno 2] No such file or directory: 'data/students.csv'。诊断:相对路径从「运行时所在目录」找起,不是从 .py 文件旁边找。修法:把 data 文件夹放到运行目录,或用绝对路径。教学点:print(os.getcwd()) 看看「我现在在哪」。E8 · 第 6 周不报错,但漏了人逻辑病 · 不报错
# excel.py · 目标:打印 90 分及以上(含 90)的优秀名单 scores = {"陈迟": 90, "赵一鸣": 88, "林可为": 91} for name, s in scores.items(): if s > 90: print(name, "优秀")
程序没炸——但结果对吗?
展开答案
什么都不报,但陈迟(90 分)不见了。诊断:
> 应为 >=——逻辑期的雷不报错、结果是错的,最危险。修法:改 >=,并养成「用小数据手算一遍对答案」的习惯。教学点:这颗雷查表查不到——它教的是测试意识,不是语法。02 / SOP埋雷日流程
每周五,十五分钟
流程固定,学生形成条件反射;雷的难度随教学周递进。
10:00 · 发雷
群里发当周雷文件,不说是哪种病。只给一句提示:「本周学过的某个知识点,被埋在这里。」
10:00–10:15
全班诊断。规矩:先在群里报「病名」,再动手修。报对 +1,修好 +1——报错修不对,比不报扣得更多。
10:15 · 讲评
请最先修好的同学走一遍三步口诀;教师只补一句:「这颗雷,下周还会炸在谁身上。」
期末彩蛋
每人给下届出一颗雷(附答案)。最好的 8 颗进下一版练习集——出题比做题更检验学会没有。
✓计分挂钩:埋雷日计入平时分;连续 4 周全对者,期末答辩免抽问一题。
✓AI 规则:允许问 AI,但必须贴出你问的 prompt——指挥 AI 找雷,本身也是一种「修好」。
「雷是老师埋的,怕是学生自己的——炸过一次,记一辈子。」
—— 八颗雷炸完,学生遇到红字的第一反应就换了:先读病名,再翻病历,三问数据。