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 的过程里出现的一些错误呢? 或者, 你有没有遇到过什么有意思的错误呢? 欢迎留言讨论, 一起聊聊.
来源: http://www.bubuko.com/infodetail-2725771.html