当前位置:首页>python>学习笔记 | 你的Python一片飘红,但你真读懂了它想说啥吗?

学习笔记 | 你的Python一片飘红,但你真读懂了它想说啥吗?

  • 2026-10-11 07:13:45
学习笔记 | 你的Python一片飘红,但你真读懂了它想说啥吗?

写Python代码的时候

你经常遇到运行一片飘红的情况↓

Python试图给你一堆报错信息

但是,看不懂英文的你

只知道代码报错了

实际上报错提供了

非常重要的定位bug的信息!

那么今天的学习笔记

我们就整理一下

Python到底有多少常见的报错类型

以及它们到底是什么意思

(文章较长,慢慢收藏查看哦)

00

✦ 目录

✦

01-SyntaxError 语法错误

02-IndentationError 缩进错误

03-NameError 命名错误

04-TypeError 类型错误

05-ValueError 值错误

06-IndexError 索引错误

07-KeyError 键错误

08-AttributeError 属性错误

09-RecursionError 递归错误

10-ZeroDivisionError 除零错误

11-FileNotFoundError 文件未找到错误

12-ModuleNotFoundError 模块未找到错误

13-Vocabulary 词汇表

01

✦ SyntaxError

✦

syntax [ˈsɪntæks] 指语法/句法,

所以SyntaxError是语法错误。

例如少个冒号、打错关键词、中文括号什么的。

SyntaxError: invalid syntax

各种无效语法,比如试图给if、class这样的保留字赋值,一句话没写完,关键字打错了什么的。现在新版的Python已经不怎么笼统地报错invalid syntax了,而是尽可能地给出具体的语法错误原因。

invalid [ɪnˈvælɪd] 无效的。

如果真是什么关键字、函数名打错了,Python可能会推测正确的关键字可能是什么。

SyntaxError: expected ":"

在if、def、class、while、for这种代码块的后面,忘了打冒号。

SyntaxError: "(" was never closed

括号不匹配,像是左边三个左括号,右边只有两个右括号,没对上。

这在旧版Python中可能会显示为“unexpected EOL while parsing”(解析中一行意外地结束了,翻译成人话就是只写了一半就没了)。EOL是end of line的缩写,代表一行的结束。

SyntaxError: invalid character ")"

常见于代码需要打中文的情况,输入法忘了切换,代码的标点里面混进了一个圆滚滚胖乎乎还笑嘻嘻看着你的中文符号。

你能分清“,”和“,”、“:”和“:”、“)”和“)”、“"”和““”吗?中文的标点一般比英文的更圆更胖,占的位置也更大。中文的引号是弯的,英文的引号是直的。

这在旧版Python中可能会显示为“invalid character in identifier”(标识符里有无效字符,也就是里面有中文符号)

identifier是标识符,这里就理解成你写的代码就行了。

SyntaxError: unterminated string literal

引号没匹配,系统识别出来半个字符串。

unterminated [ʌntɜ:mɪ'neɪtɪd] 未终止的

literal [ˈlɪt(ə)r(ə)l] 字面上的,在这里指字面量,也就是字符串的值。

这在旧版Python里可能会显示为“EOL while scanning string literal”(扫描字符串的时候一行突然结束了,就是没打右引号)

02

✦ IndentationError

✦

indentation [ˌɪndenˈteɪʃn] 行首缩进

所以IndentationError是跟缩进有关的错误。

if、while、for、def、class都需要缩进。

IndentationError: expected an indented block after ... statement

该缩进的地方没缩进。比如这样:

for i in range(3):print(i)

IndentationError: unexpected indent

不该缩进的地方缩进了。

  for i in range(3):    print(i)

TabError: inconsistent use of tabs and spaces in indentation

一会用tab缩进,一会用空格缩进,系统蒙圈了。

inconsistent [ˌɪnkənˈsɪstənt] 不一致的,矛盾的

for i in range(3):     print(i)[tab]print[i]

03

✦ NameError

✦

name是名字,NameError就是跟名字有关的错误。

NameError: name "xxx" is not defined

变量名、函数名可能没定义,或者拼写错了。

04

✦ TypeError

✦

TypeError指的是变量的类型跟程序要求的不一样。就像一台榨汁机能处理什么类型的东西?苹果、橘子、西瓜,大白菜也将就,但是没人会往里扔一台手机。当用户非要往里面扔一台手机的时候,机器炸了,因为这不是它能处理的类型。

TypeError: unsupported operand type(s) for +: 'int' and 'str'

operand [ˈɒpərænd] 指的是被运算的数字,比如加法就是加数,除法就是被除数和除数。

这个错误通常出现在需要进行数字计算或者字符拼接的时候,但是一个是数字,一个是字符串。我们知道,1+1=2,"1"+"1"="11",但是1+"1",因为两个东西的类型不一样,就没法计算。

这种错误尤其出现在由用户输入数字的时候,因为input()接收到的都是字符串,如果没转类型就做数字计算的话,就会出现这个报错。

TypeError: can only concatenate str (not "int") to str

concatenate [kɑnˈkæt(ə)ˌneɪt] 连接。

整数不能连接到字符串后面。其实跟上一个报错挺像的,当尝试将数字与字符串用加号运算的时候,如果数字在前,像是1+"1",这个时候+代表加法,就会报上面的错误,说字符串不能跟数字一起运算;如果字符串在前,像是"1"+1,+代表字符拼接,就会报这个错误,说整数不能连接到字符串后面。

TypeError: 'str' object cannot be interpreted as an integer

interpret [ɪnˈtɜrprət]:解释,在程序中是代码执行的过程。

integer [ˈɪntədʒər]:整数,缩写为int。

字符串不能被当成整数来解释,这通常出现在类似于for i in range(a)的句式结构中,这里的a需要是一个整数,但实际却收到了一个字符串。跟上一个报错一样,这经常出现于用户输入数字的情况,如果没对用户输入的字符串做类型转换就直接放到range里面,就会出错。

for i in range("10"):    print(i)

TypeError: 'xxx' object is not callable

这里的xxx通常是字符串、列表、元组等组合类型,报错内容为“这个类型的对象不能被调用”。call在这里是函数调用的意思,不是我们熟悉的打电话或者大声喊叫的意思。

当一个东西后面加上一对小括号之后,程序就会判断为函数名,如果发现它不是函数而是别的类型,就会报这个错误。

错误原因通常是在对诸如字符串的组合类型进行切片操作的时候不小心把中括号写成了小括号,或者写的时候不小心加了一对小括号。

TypeError: 'xxx' object is not subscriptable

subscript ['sʌbskrɪpt] 指的是下标。这个报错内容为"xxx"这个对象不能被下标。比如当你试图用下标来查找一个集合的元素(集合是无序的),或者不小心把函数调用中的小括号()写成了中括号[],就会报这种错误。

TypeError: func() takes exactly one argument (2 given)

每个函数都规定了参数数量,比如math.sqrt只要求一个参数,str.islower()没有参数。如果给的参数数量不对,比如math.sqrt(1,2),就会报错。

argument在这里并不是英语课上学的论点、观点、争论的意思,而是函数参数的意思。

TypeError: cannot use 'list' as a dict key (unhashable type: 'list')

Python规定字典的键只能是不可变类型,列表是不能作为字典的键的。如果非要用一个序列来做键,请把它改为元组。

unhashable: 不可哈希的,但是你不用知道哈希是什么东西,只需要知道它指的是列表、字典这样的可变类型就行了。

05

✦ ValueError

✦

ValueError是一种类型对了但具体值不对的错误。就像一个计算器,可以把用户输入的字符串转成数字计算,比如"1"可以变成1,但是如果用户非要输入一个“苹果”,这怎么转成数字呢?

ValueError: invalid literal for int() with base 10: 'xxx'

翻译一下就是不能把这个xxx转换为10进制整数。虽然这个字符串的类型是正确的,也就是可以把字符串转成整数,但这个字符串的值并不能转成整数,就会引起ValueError,就像刚才说的用户非要在计算器里输入“苹果”,这怎么转成数字呢?

ValueError: list.remove(x) / list.index(x): x not in list

试图在列表中移除或者索引一个不存在的元素,也会引发ValueError报错。这个报错并不是类型不对,因为list.remove并不要求类型;但是它的值使得无法完成移除、索引的操作。

ValueError: expected a nonnegative input, got -1.0

像是math.sqrt这样的函数也会对值有要求,它只计算非负数的平方根(这是它和x**0.5的一个区别),如果给它一个负数,也会报错ValueError。

06

✦ IndexError

✦

IndexError: list index out of range

index是索引,IndexError指的是索引引发的错误,一般是索引越界,比如一个列表只有4个元素,你非要找第5个。

这种错误常见于在遍历一个列表或者字符串的时候,for i in range的range设置的有问题,一般把这个range的终止点减1就能解决。

07

✦ KeyError

✦

KeyError: "xxx"

如果说IndexError是在列表或者字符串里找不到指定下标,那么KeyError是在字典里找不到指定的键。这种错误大概率是键名拼错了,比如图中这种情况。

08

✦ AttributeError

✦

AttributeError: 'tuple' object has no attribute 'append'

attribute指的是类或者对象的属性、方法,比如list.append()就是list的一个属性。如果你试图使用一个对象的属性或者方法,但是这个对象并没有叫这个名字的方法,那就会报错AttributeError了。

这就像你非要对着一只狗让它喵喵叫,但小狗只会汪不会喵,小狗:臣妾做不到啊,那就报个错吧。

有时候像图片这样,非要用append来修改一个元组,但元组没有append,所以就报错了;有时候是单纯的拼写错误,比如str.split()写成了str.spilt()之类的。

09

✦ RecursionError

✦

RecursionError: maximum recursion depth exceeded

recursion指的是递归,这个报错指的是达到了最大递归次数(一般是1000次)。除了非要用递归处理特别大的输入(比如计算10000的阶乘)之外,另一种更常见的原因是递归函数忘写出口了。

def factorial(n):    return n * factorial(n-1)print(factorial(5))

10

✦ ZeroDivisionError

✦

ZeroDivisionError: division by zero

division是除法的意思。小学数学老师曾经说过,0不能做除数。如果由于代码或者用户输入导致除数为0的话就会报这个错误了。

11

✦ FileNotFoundError

✦

FileNotFoundError: [Errno 2] No such file or directory: 'file.txt'

这个错误的原因是系统找不到指定的文件。可能是文件路径写错了,可能是名字拼错了,还有可能是本来应该用w模式新建的文件写成r模式了。总之,系统翻遍了你的文件夹,找不到文件。

directory [daɪˈrektəri] 文件目录。

12

✦ ModuleNotFoundError

✦

ModuleNotFoundError: No module named 'maths'

module是模块,报错原因是找不到叫这个名字的模块。这种错误在一些Python早期版本中也会显示为ImportError,导入相关的错误。

有时候这个错误是由于没安装对应的三方库引起的,也有时候像图片中这样,是把库名给拼错了。

13

✦ 词汇表

✦

因为报错是英文,大家可能看不懂,那么鸦鸦就暂且回归自己的老本行,给大家整理一下报错中常见的生词。(猜到鸦鸦的专业了吗?)

1.SyntaxError 语法错误

syntax [ˈsɪntæks] 语法

invalid [ɪnˈvælɪd] 无效的

EOL (=end of line) 一行的结束

identifier [aɪ'dentɪfaɪə (r)] 标识符,变量名

unterminated [ʌntɜ:mɪ'neɪtɪd] 未终止的

literal [ˈlɪt(ə)r(ə)l] 字面上的,在这里指字面量,也就是字符串的值

2.IndentationError 缩进错误

indentation [ˌɪndenˈteɪʃn] 行首缩进

inconsistent [ˌɪnkənˈsɪstənt] 不一致的,矛盾的

3.NameError 命名错误

4.TypeError 类型错误

operand [ˈɒpərænd] 被运算的数字

concatenate [kɑnˈkæt(ə)ˌneɪt] 连接

interpret [ɪnˈtɜrprət] 解释,代码执行

integer [ˈɪntədʒər] 整数,缩写为int

callable ['kɔləbəl] 可调用的

subscript ['sʌbskrɪpt] 下标

subscriptable ['sʌbskrɪptəbəl] 可索引的,可下标的(形容列表等组合类型)

argument [ˈɑrɡjəmənt] 参数

unhashable [ʌnhæʃəbəl] 不可哈希的,可变的(形容列表、字典等可变类型)

5.ValueError 值错误

6.IndexError 索引错误

index [ˈɪnˌdeks] 索引

7.KeyError 键错误

8.AttributeError 属性错误

attribute [ˈætrɪˌbjuːt] (类或对象的)属性

9.RecursionError 递归错误

recursion [rɪ'kɜ:ʃn] 递归

10.ZeroDivisionError 除零错误

division [dɪˈvɪʒ(ə)n] 除法

11.FileNotFoundError 文件未找到错误

directory [daɪˈrektəri] 文件目录

12.ModuleNotFoundError 模块未找到错误

module [ˈmɑdʒul] 模块,库

BNU暖阳辅导队

微信号|bnunuanyang

最新文章

随机文章