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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,210评论 4 16
  • Python 是一种相当高级的语言,通过 Python 解释器把符合语法的程序代码转换成 CPU 能够执行的机器码...
    Python程序媛阅读 1,891评论 0 3
  • 前言 Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打...
    依依玖玥阅读 3,563评论 6 37
  • 菜鸟 学习笔记 # /Users/xxxxx/Desktop/HelloPythion.py # -*- codi...
    weiwei_js阅读 822评论 0 1
  • #幸福是需要修出来的~每天进步1%~幸福实修08班~03-张恩花-富阳# 20170727(39//99) 【幸福...
    田丰房产阅读 166评论 0 2