写在前面:此文为应一好友的邀请所作,面向对象为初学Python者,加之笔者已多年未深入Python且技术有限,其中语言可能不够严谨,甚至会有错误,还望各位读者见谅,并联系我更改以免误导新手。非常感谢您的理解。本人联系方式:admin@likehide.com
目前还在持续更新中,欢迎随时回来看看。
一、 错误查看方式
1. 使用IDE查看
IDE:集成开发环境(IDE,Integrated Development
Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。 --引用自百度百科
通俗的来说就是程序开发一条龙服务,拿办酒席举例,如果不使用家政一条龙服务(IDE)。
你就需要单独请采购,负责采购所需要的食材给厨师(编辑器,用于编辑代码,相当于记事本的功能,但相对普通记事本多了代码高亮和代码补全等功能)、
厨师,负责将食材加工成人能吃的东西(编译器,用于将代码翻译成计算机可以识别的东西,虽然 python 是解释性语言使用的是解释器…)、
这个真不知道用啥举例(调试器,用于调试程序,简单说就是找出代码中的错误)、
管事,负责协调沟通客人和工作人员(图形用户界面,UI,就是你能看到的软件界面)
所以使用 IDE 的话能大大提高新手的编程效率。
对于错误的查看方式,使用 IDE 也是相当方便的,对于一些明显的语法或者拼写错误,IDE 会直接在编辑界面给出错误提示,而无需运行查看错误信息。
这里以现在常用的 IDE PyCharm 举例。
可以看到,在if 语句后面多了一条红色的波浪线,这就是在提示你此处有错误。
此时我们只需要将鼠标移至红色波浪线处就能看到错误提示:
可以看到此时提示的是 “colon expected” 按照英文直译就是缺少冒号 的意思,也就是说,我们这里缺少了一个冒号。
我们把冒号加上就会发现红色波浪线已经消失。
2. 在解释器(即上文编译器)中查看
无论是否使用IDE进行程序的编写,最终的代码都是需要由解释器进行解释并输出的,所以使用解释查看错误不仅可以在终端中查看,在IDE 中也是可以查看的。
下面我们先在IDE中进行举例:
首先故意写一个错误,然后点击运行,
可以看到,在弹出的输出窗口中出现了红色的错误提示,下面我们逐句解释怎么看这个错误信息。
首先是 File "F:/python/test_el/main.py", line 5 该句指出了出现错误的文件以及错误的位置,在这里所指即为F盘下的 python/test_el 文件夹下的 main.py 文件的第5行有错误。(对于一般的IDE或者编辑器都会在编辑界面的左侧显示文件中的行数,如果没有显示,大多数编辑器都支持使用快捷键 Ctrl+G 跳转到指定行)
下一句
if name == "el"
^
指出了第5行的哪个位置出现了错误,在这里指向的是“el” 之后。需要注意的是,该指向仅供参考,有些时候引起错误的并不是所指向的位置而是前面或后面的位置,所以排查错误时不能只看指向的位置,还需要联系上下文进行检查。
最后一句 SyntaxError: invalid syntax 指出了错误的类型和错误的具体解释,在此处即为语法错误中的无效语法。
可以看到,解释器给出的错误信息不够人性化,同时也不如 IDE 给的提示易于理解。但是解释器能够检测出的错误相对于IDE是多得多,基本上除了逻辑错误,其他的所有错误解释器都能够检测出并且给出提示。而某些错误,如 数组越界(IndexError: list index out of range) ,IDE是无法检测出来的。
由图可以看到,IDE的编辑器并没有提示错误的红色波浪线,但是运行时解释器却能够给出数组越界的提示。
然后是直接在终端中编写程序
因为其查看方式和IDE一致,且现在直接使用终端编写程序的新手少之又少,所以这里不再细说,仅举一列:
二、 常见错误
SyntaxError
(1)SyntaxError:invalid syntax
在上文中我们已经接触过一个导致 SyntaxError :invalid syntax 的原因,那就是在 if 语句后缺少冒号。
下面我们再举几个可能会导致 无效语法 错误的例子。
1. if , elif , else, for , while , class ,def 等语句末尾没有添加冒号。
解决方法:在相应的位置添加冒号:
如:
更改为
2. 尝试以Python 的关键字作为变量名、函数名、方法名、类名等
如:
解决方法:更改变量名、函数名、方法名、类名为其他名字
如:
附Python中的关键字(给变量取名的时候千万不能取成下面的这些名字哦):
and, or,not, is, as, assert, break, pass, continue, class, def, del, if, elif, else,except, False, True, finally, for, from, global, import, in, lambda, None,nonlocal, raise, return, try, while, with, yield
3. 语句不完整,缺少左括号等(为什么是左括号呢?因为右括号报的是另外一个错误…)
如:
解决方法:补全缺少的部分,如:
4. 关键字拼写错误
如:
解决方法:
请检查你的关键字是否拼写错误,并更正,如:
5. 缩写错误
在使用 += 、-= 等缩写时不能在中间添加空格,否则会报错:
解决方法:去除多余的空格
(2)SyntaxError: Missingparentheses in call to 'print'
首先看两张图:
可以看到,相同的代码,第一张图没有报错,但是第二张图却报错了。
不知道大家有没有注意到,在截图的第一行,有这么一行文字:
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 6 2014, 22:16:31) [MSC v.1600 64 bit (AMD64)]on win32
这表示的是 Python 的解释器的版本,仔细观察上图,不难发现,两张图的解释器版本并不一样。
还记得前文提到的 Python 的关键字吗?
没错,在 Python 2.x 版本中 print 是作为关键字出现的,而在Python 3.x 版本中,print是作为函数出现。
以上内容不理解没关系,只要记得在 python 2.x 中使用形如 print “hello”
在 python 3.x 中使用形如 print(“hello”)
如果你还是不知道什么意思或者说怎么用请一律使用形如 print(“help”)
并且出现 SyntaxError: Missing parentheses in call to 'print' 错误时将print的括号加上即可。
(PS:本来这个错误不应该特别强调不然反而会让初学者懵逼,但是考虑到现在Python 2.x 代码仍然很多,为了避免初学者使用3.x 的解释器去运行2.x的代码导致出错,我还是单独把这个错误提出来讲一下)
(3)SyntaxError:EOL while scanning string literal
当字符串忘记打引号时会出现该错误。如:
解决方法:补全引号,如:
(4)SyntaxError: unexpected EOFwhile parsing
该错误意为 语法错误:意外的文件末尾,出现情况如下:
可以看到是因为最后一行代码缺少了一个右括号造成的。
解决方法:补全括号即可。
那么,问题来了,如果缺少括号的代码不是在文件末尾会报什么错误?我们来看看:
从图中,可以很明显的看到,错误的并不是错误提示给出第5行,而是它的上一行:第4行,所以上文才说错误提示给出的错误位置不一定就是正确的位置,像现在这种情况,因为第一个 print 没有右括号,所以解释器在翻译时会认为第一个 print 函数并没有结束,下一个print 函数也是属于第一个 print 的,但是很明显这样做是不符合语法的,所以报了 无效的语法 错误。
解决方法:补全第一个 print 函数的右括号。
NameError
(1) NameError:name 'xx' is not defined
出现该问题的原因是 xx 未定义(xx可能是变量名也可能是函数名等),如:
解决方法,检查1.是否是变量名或函数名拼写错误。2.是否是没有定义该变量、函数名。3.是否是忘记导入相应模块。如:
又如:
解决:
IndentationError
该错误常见的错误提示有:
1.IndentationError:unexpected indent
2.IndentationError:unindentdoes not match any outer indetation level
3.IndentationError:expectedan indented Block
虽然这些错误的提示不同,但是无外乎都是缩进问题。
首先解释何为缩进,缩进即为在代码前面添加空格(或TAB),从而区分不同的代码块。
例如:
上述代码将会输出:
可以看到在上图中,if 的下一行前面多了四个空格,而 else 并没有空格,但 else 的下一行的前面却又有4个空格,这表示 print(“el”) 语句属于 if “管辖”,而 else 并不属于,但 print(“world”) 属于 else 管辖。
不同于其他语言,python 对于缩进的要求是极为严格的,只要有缩进不对,都会报错。如:
上述代码我们想实现的是如果名字等于 el 就输出 el ,否则输出 world ,但是我们却在第一个 if 下面忘记加上空格,这样 if 就无法区分究竟哪一行代码属于它管辖,从而造成缩进错误。
解决方法:按照实际情况添加空格
还有一种情况就是前后使用空格数量不同,如:
解决方法:请始终保证你的缩进量(空格数)一致
最后,还有可能因为 TAB 与空格混用导致缩进错误,但是却不容易看出来,所以我建议使用空格作为缩进而不是 TAB
TypeError
(1) TypeError: Can't convert 'xxx' object to str implicitly
造成该错误的原因是尝试连接不同类型的变量,如:
解决方法:请确保欲连接的变量是同一类型,如不是同一类型,仍然想要连接,请尝试强制转换成同一类型,如将 int 转换成 str :
IndexError
(1) IndexError: list index out of range
数组越界,造成该错误是因为引用的数组下标已经超出了数组的实际大小,如:
可以看到数组只有3个元素,但是我们却尝试引用第四个元素。
解决方法:检查数组大小,确保没有越界。如:
上述程序输出:
PS:该错误通常出现在遍历数组时没有正确判断数组大小。
UnicodeEncodeError
编码错误,一般在使用中文时或者打开编码不同的文件时会出现该问题,该问题需要具体情况具体分析,我自己目前对于该问题都还是一脸懵逼,所以就不举例了。
一般来说,解决方法有:
1. 在最顶部添加代码 #coding=utf8 (或其他合适的编码)
2. 在出现错误的字符后添加 encode(“utf8”) 或 decode(“utf8”) (或其他适合的编码)
三、 遇到没见过的错误怎么办?
请善用搜索,请将错误提示(如:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1…)复制至搜索引擎(如 百度)中,你将会得到解决方法。