刚开始学 Python 的时候,最让人头疼的往往不是代码不会写,而是——代码写完了,一运行就是满屏红字。
尤其是新手,看到 SyntaxError、TypeError、NameError 这些英文报错,第一反应往往是:“我代码是不是全写错了?”
其实没那么严重。
Python 的报错信息并不是在“吓你”,而是在告诉你:代码在哪出了问题,以及大概是什么问题。
只要把常见报错认熟,以后再看到红字,基本就知道该从哪里开始检查了。
一、SyntaxError:语法写错了
这是新手最常见的报错之一。
比如:
if age > 18
print("成年")
这里 if 后面少了一个冒号 :,Python 无法正确理解代码结构,就会出现 SyntaxError。
遇到这种报错,优先检查括号、引号、冒号、逗号等符号有没有漏写或写错。
二、IndentationError:缩进不正确
Python 对缩进非常严格,例如:
if age > 18:
print("成年")
print() 本来应该属于 if 里面的代码,却没有缩进。
正确写法:
if age > 18:
print("成年"
)
所以出现 IndentationError 时,不要急着改逻辑,先检查代码前面的空格和缩进层级。
三、NameError:变量根本不存在
比如:
print(username)
如果前面从来没有定义过 username,Python 就不知道它是什么。
还有一种特别常见的情况:
user_name = "小明"
print(username)
两个变量看着很像,但名字并不一样。
因此遇到 NameError,重点检查:变量有没有提前定义、名称有没有拼错、大小写是否一致。
四、TypeError:数据类型用错了
例如:
age = 18
print("年龄:" + age)
字符串不能直接和整数进行这种拼接。
可以改成:
print("年龄:" + str(age))
所以 TypeError 很多时候不是你的程序逻辑错了,而是当前操作不支持这种数据类型组合。
五、IndexError:索引超出范围
例如:
names = ["小明", "小红",
"小李"]
print(names[3])
列表虽然有3个元素,但 Python 的索引是从 0 开始的。
也就是说:
names[0]
names[1]
names[2]
才是有效位置。
访问 names[3] 就会出现 IndexError。
六、KeyError:字典里没有这个键
例如:
user = {"name": "小明", "age": 18}
print(user["city"])
因为字典中根本没有 city,所以程序会报 KeyError。
如果不确定某个键是否存在,可以使用:
print(user.get("city"))
这样即使不存在,也不会直接因为这个键而报错。
七、AttributeError:对象没有这个属性或方法
例如:
name = "python"
name.append("!")
字符串没有 append() 方法,所以会出现 AttributeError。
append() 一般用于列表:
names = ["Python"]
names.append("Java")
看到这种报错,先确认:当前变量到底是什么类型,这个类型是否真的支持你调用的方法。
八、FileNotFoundError:文件没找到
比如:
open("data.txt", "r")
如果当前路径下根本没有 data.txt,程序自然找不到。
这时候重点检查的不是 Python 语法,而是文件名、文件路径以及程序当前运行目录。
尤其是在 PyCharm、VS Code 里运行代码时,新手经常以为文件“就在旁边”,实际上程序读取的工作目录可能完全不同。
看到报错,别急着乱改代码
以后再遇到一大串红色报错,可以先看最后几行。
通常你最需要关注的是两个东西:
报错类型 + 报错位置。
比如:
TypeError: ...
先知道它属于 TypeError,再根据提示找到对应代码行,检查数据类型。
慢慢你就会发现,会看报错,本身就是学 Python 很重要的一项能力。
刚开始可能看到红字就头疼,等这几个高频报错见多了以后,你甚至还没看完整段提示,就已经大概知道问题出在哪了。