Python学习常遇到哪些报错?在这里汇总了

Python 专栏收录该内容
10 篇文章 35 订阅

学习时,在刚刚接触python的时候,经常会因为缩进、类型等问题而报错。下面把这些常会遇到的报错及这些错误的解决方法总结一下。

同一个错误中的举例,就举一个例子好了。

一、IndentationError(缩进错误)

1.1 问题描述

代码举例

if True:
    print("苜苜")
    print("的烂笔头")
else:
    print("苜苜")
  print("的演示")

报错信息
在这里插入图片描述
缩进问题,会有以下之类的错误提示:

  1. IndentationError:未缩进不匹配任何外部缩进水平
IndentationError: unindent does not match any outer indentation level
  1. IndentationError:意想不到的缩进
IndentationError: unexpected indent
  1. IndentationError:需要一个缩进的块
IndentationError:expected an indented block

1.2 解决方法

对于缩进这个问题,找到对应的位置,调整缩进就可以了。

如果是使用Pycharm这个IDE写的话,可以按快捷键ctrl+shift+L进行代码排版格式化,当然有时候格式化并没有那么智能,还是需要找到相应的位置,按tab或者shift+tab调整(少空格的话按 tab ,空格多了的话按 shift+tab 组合键)。

这个问题通常是copy代码的时候排版出现问题,导致代码的缩进出现了问题。

Pycarm的常用快捷键可以看看这篇文章:Pycharm常用快捷键总结

二、NameError(名字错误)

2.1 问题描述

代码举例

prit("Hello World!")

报错信息
在这里插入图片描述

  1. 名称错误:未定义名称“prit”
NameError: name 'prit' is not defined

2.2 解决方法

定位到报错提示的位置,修改名字。

不要打错变量名、类名、函数名之类的,这个原因的话一般出现不多,因为Pycharm有自动补全的功能, 首字母+选择相应位置+ tab键 就可以自动补全了不用一一输入。另外,这个问题的报错,还有别的一些情况,比如在使用变量前 没有进行赋值就调用了(函数的定义要放在函数调用之前),又或者使用第三方库前没有导入,就调用这个库的方法了。

总的来说,这个问题产生的原因是标识符(名字)还没存在,就使用了。

三、SyntaxError(语法错误)

3.1 使用了中文标点符号

3.1.1 问题描述

代码举例

print("Hello ", "苜苜的烂笔头")

报错信息
在这里插入图片描述

  1. 标识符中无效字符
SyntaxError: invalid character in identifier
3.1.2 解决方法

根据错误提示找到对应的位置,把中文的符号改为英文的标点符号。

一般都是切换到英文输入法状态下进行编辑的,除了字符串可以有中文,其它都不可以有中文。

3.2 括号没有成对出现

3.2.1 问题描述

代码举例

print("Hello World!"

报错信息
在这里插入图片描述

  1. 语法错误:解析时意外的EOF
SyntaxError: unexpected EOF while parsing
3.2.2 解决方法

定位到报错的位置,补充缺失的括号。这个问题通常是在调用函数的时候或写一些很复杂的表达式时出现。

在这里推荐一个Pycharm的插件——彩虹括号(Rainbow Brackets),这个插件会 对括号进行颜色标记 ,如果是不成对出现的话,括号会是白色的,当然不成对出现的话Pycharm也会报红线提示(前提是你使用这个IDE)。

这里有一个IDEA插件介绍的文章,IDEA的大部分插件在Pycharm中都可以使用,文章地址:IDEA企业开发之插件推荐。当然也可以直接搜Pycharm的相关插件,去下载合适自己的插件,以便提高学习工作的效率。

3.3 引号没有成对出现

3.3.1 问题描述

代码举例

print("Hello World!)

报错信息
在这里插入图片描述

  1. 扫描字符串文本时的EOL
SyntaxError: EOL while scanning string literal
3.3.2 解决方法

根据报错提示定位到对应的位置,补充括号。字符串一定要放在引号之中,python不区分单双引号,用单双引号都可以。

这个问题一般在字符串中出现多个单引号或双引号时遇到。如果是用Pycharm,引号不成对出现的话,这行后面都变绿色了,这是一个很好很重要的提醒。

3.4 错误使用自操作运算符

3.4.1 问题描述

代码举例

l = 100
l + +

报错信息
在这里插入图片描述

  1. SyntaxError:无效的语法
SyntaxError: invalid syntax
3.4.2 解决方法

Python没有++或者–这类自操作运算符(C语言有),相对应的Python应该是+=或者-=,以此来代表自增或者自减。

3.5 没有在class/def/while/if/else/for等语句后面添加冒号

3.5.1 问题描述

代码举例

l = "100"
for i in l
    print(i)

报错信息
在这里插入图片描述

  1. SyntaxError:无效的语法
SyntaxError: invalid syntax
3.5.2 解决方法

根据错误提示找到出错的位置,补充冒号。

3.6 混淆了=和==

3.6.1 问题描述

代码举例

if l=100:
    print("苜苜")

报错信息
在这里插入图片描述

  1. SyntaxError:无效的语法
SyntaxError: invalid syntax
3.6.2 解决方法

定位到报错信息中代码的位置,补充等号。

Python中的=是赋值运算符==作为判断左右两边运算量是否相等的关系运算符

3.7 使用了Python的关键字作为变量名

3.7.1 问题描述

代码举例

False = 100

报错信息
在这里插入图片描述

  1. 无法赋值为False
SyntaxError: cannot assign to False
3.7.2 解决方法

定位到报错的位置,修改变量名。

不要使用Python的关键字作为变量名,也不能用这些关键字作为函数名、类名之类的。想知道Python的关键词,可以打开Python Shell,输入help(‘keywords’)查看。

四、AttributeError(属性错误)

4.1 问题描述

这个错误的例子比较多,除了自己在写代码的时候写错,还有可能是因为随着一些模块的更新,相关的属性也有可能发生了变化。

比如根据下面这篇文章来举例,这个问题是模块更新后属性发生了变化。
文章地址:报错AttributeError: module ‘pandas’ has no attribute ‘tslib’ 的解决方法

报错信息
1.属性错误:模块“pandas”没有属性“tslib”

AttributeError: module 'pandas' has no attribute 'tslib'

4.2 解决方法

在属性名没有写错的情况下,看看报错的模块中属性有没有发生变化。还有个方法是将元组转换为列表添加元素,这个就要对元组、列表有较深的理解了,熟悉这两者的区别。

写代码的时候不要写错类的属性名,还有不少原因是相关的模块更新后没有了这个属性或者这个属性发生了变化,这些都是需要注意的。

五、TypeError(类型错误)

5.1 与字符串连接报错

5.1.1 问题描述

代码举例

print("苜苜" + 100)

报错信息
在这里插入图片描述

  1. 类型错误:只能将str(不是“int”)连接到str
TypeError: can only concatenate str (not "int") to str
5.1.2 解决方法

对于上面这个问题,使用 str() 函数将其转换,代码改为:

print("苜苜" + str(100))

在这里插入图片描述

这样就可以了。

Python不能像Java一样在拼接的时候自动把类型转换为string类型,所以要先用 str() 函数转换为字符串类型,再使用整数、浮点数或布尔类型与字符串进行连接操作。

5.2 调用函数时参数个数错误

5.2.1 问题描述

代码举例

input(100, "苜苜的烂笔头")

报错信息
在这里插入图片描述

  1. 类型错误:输入最多应有1个参数,但得到2个
TypeError: input expected at most 1 argument, got 2
5.2.2 解决方法

注意,只有print()函数支持可变数量的参数
解决方法一: 仅将一个参数传递给input()

input(str(100) + "苜苜的烂笔头")

在这里插入图片描述

解决方法二: 使用字符串格式

input(" {} 苜苜的烂笔头".format(100))

在这里插入图片描述

要熟悉函数的用法,了解函数参数的定义,才能正确地调用参数。

六、KeyError(键错误)

6.1 问题描述

代码举例

l = {'a': 1,
     'b': 0,
     'c': 0
     }
print(l['d'])

报错信息
在这里插入图片描述

  1. 键错误:d
KeyError: 'd'

6.2 解决方法

这个问题是因为使用了不存在的键名访问字典中的元素。

解决方法一: 使用in关键字检查该键名是否存在

l = {'a': 1,
     'b': 0,
     'c': 0
     }
if 'd' in 'l':
    print("l[d]")
else:
    print("none")

在这里插入图片描述

解决方法二: 使用dict内置的 get(key[,default]) 方法(如果key键存在,则返回其value;如果不存在,则返回default),这个方法不会触发KeyError

l = {'a': 1,
     'b': 0,
     'c': 0
     }
print(l.get('d'))

在这里插入图片描述

当然,还可以加上default参数

l = {'a': 1,
     'b': 0,
     'c': 0
     }
print(l.get('d', 'Not Exist'))

在这里插入图片描述

解决方法三: 使用dict内置的 setdefault(key[,default]) 方法(如果key存在,则返回其value;如果不存在,则插入此key,其value为default,并且返回default),这个方法也不会触发KeyError

l = {'a': 1,
     'b': 0,
     'c': 0
     }
print(l.setdefault('d'))

在这里插入图片描述

给它加上default参数

l = {'a': 1,
     'b': 0,
     'c': 0
     }
print(l.setdefault('d', 'Not Exist'))

在这里插入图片描述

七、IndexError(索引错误)

7.1 问题描述

代码举例

l = [1, 2, 3]
print(l[3])

报错信息
在这里插入图片描述

  1. 列表索引超出范围
IndexError: list index out of range

7.2 解决方法

根据错误信息修改对应的索引编号。可以使用 len() 函数获取列表的长度,再判断要访问的索引是否超出列表的范围。

以上代码报错,是因为列表中没有第四个索引(列表索引的编号是从0开始,也就是说,列表中的1对应是索引的0,3对应的索引是2),索引超出列表的范围。

八、FileNotFoundError(文件未找到)

8.1 问题描述

这个问题通常是在读取文件的时候路径写错,比如斜杠的问题,又或者是文件名问题之类的。这里就不做代码举例了,之前有写过这个问题的解决方法,可以看看下面这篇文章。

文章地址:Python运行报错FileNotFoundError [Errno 2] File b‘xxx.csv’ does not exist b‘xxx.csv’的原因分析及其解决方法

报错信息

FileNotFoundError: File b'xxx.csv' does not exist

8.2 解决方法

要确保代码中的路径下有那个文件,在读取文件路径前面加上r,代表的是只读,作为文件路径读取。另外,斜杠也是需要注意的,比如把\改为/,又或者使用\\进行转义。

读取的路径可以写绝对路径(就是把需要读取的文件具体到某个盘的某个文件夹下面,这个绝对路径可以打开 文件资源管理器 ,进去复制)。

九、ModuleNotFoundError(模块未找到)

9.1 问题描述

代码举例

import pandas as pd

报错信息

  1. 模块未发现错误:有名为’pandas’的模块
ModuleNotFoundError: No module named 'pandas'

9.2 解决方法

没有下载这个模块,下载这个模块就可以了(打开 cmd ,输入pip install xxx这个命令,需要下载的模块名代替命令中的xxx)。

还有另外的一种情况,就是将调用的模块路径与被调用的模块路径不一致,对于这个错误原因,可能是电脑中有多个python版本,删掉多余的版本只留一个就可以了。

十、UNboundLocalError(未初始化本地变量)

10.1 问题描述

代码举例

l = 100

def demo():
    l += 1
    print(l)

demo()

报错信息
在这里插入图片描述

  1. 未绑定本地错误:在赋值之前引用了局部变量l
UnboundLocalError: local variable 'l' referenced before assignment

10.2 解决方法

这个错误是因为在函数内部对变量赋值进行修改后,该变量被Python解释器认为是局部变量,而不是全局变量,( l+=1 这条语句是给l赋值,所以l成为了局部变量,在程序执行 print l 的时候,l这个局部变量还没有定义,所以会报错)。

让l成为全局变量,在函数内部修改该变量,修改后代码如下:

l = 100

def demo():
    global l
    l += 1
    print(l)

demo()

在这里插入图片描述

在函数内使用全局变量的时候,要使用global关键字对其进行声明。


本文是归纳总结类的文章,建议收藏。如果文章对你有帮助,请点个😊,顺带留个评论,将感激不尽😉。如果能给个三连(点赞收藏关注 )就最好啦😁。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2022 CSDN 皮肤主题:岁月 设计师:pinMode 返回首页

打赏作者

苜苜的烂笔头

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值