Python是一门灵活的,有意思的,用途普遍的语言。近些年来,受到愈来愈多的重视。也有愈来愈多的人来学习这门语言。python
因而,问题来了,对于初学者,每每在写代码的过程当中,出现这样或那样的错误,致使程序运行报错。这些错误或简单,或复杂,或诡异,或神奇,要么使人抓耳挠腮,要么让人恼羞成怒,要么让人难以忘怀。可是,在学习编程的过程当中,就是这些错误让咱们成长,让咱们逐渐从采坑再爬坑的过程当中,感觉到编程的魅力。编程
到底有哪些错误呢,请看DE8UG给你带来的"Python花式错误集锦",若是你遇到了Python开发中的错误,从本文搜索关键词并获得解决,那是个人荣幸。json
这是在复制粘贴代码,或者不熟悉Python代码结构时候,常常范的错误。Python中要求同一逻辑的代码块使用一样的缩进(经常使用4个空格)。api
看这段:网络
def test(): a = 1 b = 2 return a + b
运行后,立马报错app
File "<ipython-input-1-515579e6247e>", line 4 return a + b ^ IndentationError: unindent does not match any outer indentation level
解决方法,很简单,把缩进调整为统一的4个空格就好。ide
这里状况就比较多了,常见的为函数
来看看具体错误样式学习
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
修改方式很简单,代码里的标点符号都是英文,出现语法错误好好检查看看标点符号的宽度,个人简单记法是中文的都比较胖,英文的都是瘦子。另外,对于括号的问题,首先是要英文,其次呢写的时候,养成一种上来先把成对()写好的习惯,而后再填内容。ui
最须要禁止的是使用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文件又须要导入本身定义的其余模块,
但此时系统不知道哪些模块的存在,解决办法是在运行的第一个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哥小灶时间>,转载请注明出处)