新手向:Python常见错误及解决方法

作者: equationl | 来源:发表于2018-04-28 17:32 被阅读0次

    写在前面:此文为应一好友的邀请所作,面向对象为初学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…)复制至搜索引擎(如 百度)中,你将会得到解决方法。

    相关文章

      网友评论

        本文标题:新手向:Python常见错误及解决方法

        本文链接:https://www.haomeiwen.com/subject/kfzglftx.html