读懂报错 · Python 从零开始
Python 说出错了,该怎么办?
课程目录为什么需要它
每个程序员每天都会遇到报错,这并不说明你学不好。报错信息 Error message 是一条线索,告诉你在哪里、出了什么问题。学会冷静地读它,比任何别的技巧都省时间。
直觉理解
报错就像导航说「第 3 个路口走错了」。要读三样东西:
- 行号:Python 在哪一行发现了问题(这个网站会把那一行标红)。
- 类型:是哪一类问题。
- 说明:具体细节。
最常见的几类:
| 类型 | 意思 |
|---|---|
| SyntaxError 语法错误 | 语法不对:少了括号、引号或冒号。整个程序一行都不会运行。 |
| NameError 名字错误 | 用了 Python 不认识的名字:拼写错误,或者文字没加引号。 |
| TypeError 类型错误 | 把不能放在一起的值放在一起了,比如文字 + 数字。 |
中文键盘的特别陷阱:( ) “ ” : , 看起来和 ( ) " " : , 几乎一样,但 Python 不认。记得切换到英文输入法。
定义
语法错误 Syntax error
A syntax error means the code breaks the grammar rules of the language, so the program cannot start.语法错误表示代码违反了语言的语法规则,所以程序根本无法开始运行。
运行时错误 Runtime error
A runtime error happens while the program is running; the lines before it have already run.运行时错误发生在程序运行过程中;出错之前的那些行已经执行过了。
示例
名字拼错了
动手试试运行看看:报错指向第 2 行。把大写的 N 改掉再运行。
name = "Ada"
print(Name)这个例子故意以报错结束:重点是学会读报错信息。
逐步执行
- L1第 1 行没问题:把 "Ada" 存在名字
name下。 - L2
Name(大写 N)是另一个名字,Python 从没见过它:NameError。
中文标点
动手试试仔细看括号。换成英文括号再运行。
print("first line")
print("second line")这个例子故意以报错结束:重点是学会读报错信息。
逐步执行
- L2( 和 ) 是全角(中文)括号。Python 在运行任何一行之前就停了,连第 1 行也不会运行。
常见错误
真正的错误可能在上一行
第 3 行少了 ),经常会在第 4 行才报错,因为 Python 到那里才发现不对。既要看报错的那一行,也要看它上面一行。
改掉一个,又冒出下一个
Python 一次只报告一个错误。改完再运行,出现新的错误通常说明你有进展。
小测验
1. 会打印出什么?
print("one")
print("two"
print("three")查看答案
答案:C
语法错误会让程序在开始之前就停下,所以连第 1 行都不会运行。
2. 报错之前打印了什么?
print("start")
print(10 / 0)
print("end")查看答案
答案:A
这是运行时错误:第 1 行已经运行,第 2 行出错,第 3 行不会运行。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出先打印了什么?
这段程序会出错。写出它在出错之前打印的内容。
- 改需求修两个错误
这段程序应该打印
Total: 5,然后打印Done。把错误修好。 - 从零写重新写对
有人用中文键盘敲了下面这段代码,里面有三处问题:
print("Python") print("Year:", 2026) Print("OK")在编辑器里写出正确的版本(自己打,不要粘贴)。它应该打印:
Python Year: 2026 OK
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Syntax error | 语法错误 | An error where code breaks the language's grammar, so the program cannot start. |
| Runtime error | 运行时错误 | An error that happens while the program is running. |
| NameError | 名字错误 | An error raised when code uses a name that has not been defined. |
| TypeError | 类型错误 | An error raised when an operation is used on a value of the wrong type. |