我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python花式错误集锦(长期更新)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python花式错误集锦(长期更新)

Python是一门灵活的,有意思的,用途广泛的语言。近些年来,受到越来越多的重视。也有越来越多的人来学习这门语言。

于是,问题来了,对于初学者,往往在写代码的过程中,出现这样或那样的错误,导致程序运行报错。这些错误或简单,或复杂,或诡异,或神奇,要么令人抓耳挠腮,要么让人恼羞成怒,要么让人难以忘怀。但是,在学习编程的过程中,就是这些错误让我们成长,让我们逐渐从采坑再爬坑的过程中,感受到编程的魅力。

到底有哪些错误呢,请看DE8UG给你带来的"Python花式错误集锦",如果你遇到了Python开发中的错误,从本文搜索关键词并得到解决,那是我的荣幸。

语法错误篇

缩进IndentationError

这是在复制粘贴代码,或者不熟悉Python代码结构时候,经常范的错误。Python中要求同一逻辑的代码块使用同样的缩进(常用4个空格)。

看这段:

def test():
    a = 1
    b = 2
   return a + b

运行后,立马报错

  File "<ipython-input-1-515579e6247e>", line 4
    return a + b
                ^
IndentationError: unindent does not match any outer indentation level

解决方法,很简单,把缩进调整为统一的4个空格就好。

标点符号SyntaxError

这里情况就比较多了,常见的为

  • 冒号错误
  • 逗号错误
  • 小括号缺失或不匹配

来看看具体错误样式

def test():
    pass

  File "<ipython-input-2-b5cadef232ad>", line 1
    def test():
              ^
SyntaxError: invalid character in identifier

print(1,2,3,4,5,6)
  File "<ipython-input-3-be45856da7c7>", line 1
    print(1,2,3,4,5,6)
                ^
SyntaxError: invalid character in identifier

def test_a(a):
    return a * 2

def test_b(b):
    return b + 3

def test_c(c):
    return c - 4

x = 5
test_c(test_b(test_a))

TypeError                                 Traceback (most recent call last)
<ipython-input-4-af8d9c054419> in <module>()
      9 
     10 x = 5
---> 11 test_c(test_b(test_a))

<ipython-input-4-af8d9c054419> in test_b(b)
      3 
      4 def test_b(b):
----> 5     return b + 3
      6 
      7 def test_c(c):

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

# 还可能这样
test_c(test_b(test_a())

  File "<ipython-input-5-eab78f53d59a>", line 11
    test_c(test_b(test_a())
                           ^
SyntaxError: unexpected EOF while parsing

修改方式很简单,代码里的标点符号都是英文,出现语法错误好好检查看看标点符号的宽度,我的简单记法是中文的都比较胖,英文的都是瘦子。另外,对于括号的问题,首先是要英文,其次呢写的时候,养成一种上来先把成对()写好的习惯,然后再填内容。

变量应用篇

命名错误

最需要禁止的是使用Python自带的关键词来命名,比如list,dict等,会导致类型错误。

a = (2,5,8)
a_list = list(a)  # 第一次可以用list转换
list = list(a)  # 如果把list当作变量名,会引起后续代码再用list转换时候报错
b = (3,5,7)
b_list = list(b)
TypeError                                 Traceback (most recent call last)
<ipython-input-12-70adb4cffa4f> in <module>()
      1 b = (3,5,7)
----> 2 b_list = list(b)

TypeError: 'list' object is not callable
2b = c
  File "<ipython-input-7-9b1de15aaa88>", line 1
    2b = c
     ^
SyntaxError: invalid syntax

a-2 = 1
  File "<ipython-input-8-ac5315177c02>", line 1
    a-2 = 1
           ^
SyntaxError: can't assign to operator

命名时候,建议使用下划线_连字符,或者theName,或者TheName这种首字母大写的驼峰法。
而且,不建议使用0(数字零)或者l(小写的L)来命名,否则容易引起下面的使用错误。

使用错误

这里最常见的是使用容易混淆的字母来命名,造成似乎用时候出错,或者是使用时候完全用错了变量。

name_l = 'de8ug'
print(name_1)
NameError                                 Traceback (most recent call last)
<ipython-input-13-cfee4c383b1a> in <module>()
      1 name_l = 'de8ug'
----> 2 print(name_1)

NameError: name 'name_1' is not defined

name_0 = 'de8ug'
print(name_o)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-14-7b351863596a> in <module>()
      1 name_0 = 'de8ug'
----> 2 print(name_o)

name = 'de8ug'
print(f'name')
print(f'{de8ug}')
print(f'{name}')
NameError                                 Traceback (most recent call last)
<ipython-input-17-22b546a709ce> in <module>()
      1 name = 'de8ug'
      2 print(f'name')
----> 3 print(f'{de8ug}')
      4 print(f'{name}')

NameError: name 'de8ug' is not defined

编码错误篇

Python3中,最常见的编码错误是在网络应用中,有时候得到的数据是bytes,但是我们实际需要str,这时候就需要转换编码。

这里需要注意bytes和str的转换,其中 encoding='utf-8'是默认的参数

name = "de8ug"
print(type(name))  # str
print(type(name.encode()))  # bytes, S.encode(encoding='utf-8', errors='strict') -> bytes

name = b"de8ug"
print(type(name))  # bytes
print(type(name.decode()))  # str, decode(encoding='utf-8', errors='strict') --> str

导入模块篇

  • 没有提前导入

这种情况经常发生在使用某些模块的功能,但是py文件头部忘记导入

json.loads('{"name":"de8ug", "city":"beijing"}')

NameError                                 Traceback (most recent call last)
<ipython-input-41-fd9b6a45da38> in <module>()
----> 1 json.loads('{"name":"de8ug", "city":"beijing"}')

NameError: name 'json' is not defined

这种情况经常出现在学习某些新内容,学习(chao)完代码开始运行时候,发现啥啥啥没defined,这时候就需要去检查是不是最开始没有import的问题了。

当加入 import json后,可得到正确结果{'name': 'de8ug', 'city': 'beijing'}

  • 运行py文件时候报错ModuleNotFoundError: No module named 'xxx'

这种情况一般是,运行的那个py文件又需要导入自己定义的其他模块,
但此时系统不知道哪些模块的存在,解决办法是在运行的第一个py文件头部,添加如下代码:
这种情况适用于有个project项目,里面又bin,conf,app等目录,当bin里面的py文件又需要引入conf,app等目录的模块时候,需要让系统本身知道project这目录的存在,先有爷爷,然后才能有孙子啊。

import os
import sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

函数使用篇

  • 作用域问题

Python在函数中使用变量的时候,会按照LEGB(Local(本地),Enclosing(封闭),Global(全局),Built-in(内置))这种作用域的顺序来查找变量。如果有赋值(给同名的变量)操作,需要确保当前作用域下已经有这个变量。因为这时候Python认为函数内部和外部有同名的变量,会把外部的屏蔽。

name = 'de8ug'
def say_name():
    print(f'name is: {name}')

say_name()  # 这时候正常, name is: de8ug

name = 'de8ug'
def say_name():
    name = name.capitalize()  # 把名字大写,并赋值给name
    print(f'name is: {name}')

say_name()

---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-37-05a0d34cba37> in <module>()
      4     print(f'name is: {name}')
      5 
----> 6 say_name()

<ipython-input-37-05a0d34cba37> in say_name()
      1 name = 'de8ug'
      2 def say_name():
----> 3     name = name.capitalize()  # 把名字大写,并赋值给name
      4     print(f'name is: {name}')
      5 

UnboundLocalError: local variable 'name' referenced before assignment
这时候提示错误,name作为局部变量,在赋值前被引用了。因为和外部变量同名,此时name.capitalize()引用name的时候,在函数内部还没有name这个变量的具体内容,所以报错。

修改方式:
直接引用外部变量,使用相应的方法,或者采用不同的变量名

print(f'name is: {name.capitalize() }') #  直接打印
或
cap_name = name.capitalize()

类似的还有+=的时候,这时候相当于两部操作,先=+,但,如果函数内部变量和函数外相同,就会出现类似上面的错误。你感受一下:

n = 10
def add():
    n += 8
    print(n)

add()
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
<ipython-input-46-8215b717b8ed> in <module>()
      4     print(n)
      5 
----> 6 add()

<ipython-input-46-8215b717b8ed> in add()
      1 n = 10
      2 def add():
----> 3     n += 8
      4     print(n)
      5 

UnboundLocalError: local variable 'n' referenced before assignment

小结

ok,最后我们总结一下,常见的错误有这么几种,

  • 语法错误
  • 变量应用
  • 编码错误
  • 导入模块
  • 函数作用域

你都犯过了吗?

聊到最后,有没有解决你学习Python的过程里出现的一些错误呢?或者,你有没有遇到过什么有意思的错误呢?欢迎留言讨论,一起聊聊。

(首发于公众号<第8哥小灶时间>,转载请注明出处)

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python花式错误集锦(长期更新)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python花式错误集锦(长期更新)

Python是一门灵活的,有意思的,用途广泛的语言。近些年来,受到越来越多的重视。也有越来越多的人来学习这门语言。于是,问题来了,对于初学者,往往在写代码的过程中,出现这样或那样的错误,导致程序运行报错。这些错误或简单,或复杂,或诡异,或神
2023-01-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录