文章中,我将总结新老Python程序员常犯的一些过错,以协助你们在自己的作业防止犯相同或相似过错。
首要我要阐明一下的是,这些都是来源于榜首手的经历。我以教学Python的常识为生。在曩昔的7年里,我现已给上千名学生教学上百堂Python的课程,一起看着这些学生们犯相同的错。也就是说,这些是我看着Python初学者活生生犯的错,千百次的错。
事实上,这些过错实在是太遍及了以致于我敢保证你刚开端学的时分是必定会犯的。
“那么是什么呢?”你会问,“你也会在Python里犯那么多错么?”是的。Python或许是最简略、最灵敏的言语之一,但它毕竟仍是一门编程言语。它依然有语法,数据类型,以及巫师蒂姆寓居的漆黑旮旯。
典故出自《蒙蒂派森与圣杯》中的魔法师蒂姆,他主角们指点在窟窿的墙壁上记载的圣杯方位,作者在此处的意思是Python言语里简略犯错的当地。另,Python言语得名于作者Guido
van Rossum特别喜爱的《蒙蒂派森飞翔马戏团(Monty Python’s Flying Circus)》——译者注
好工作是多亏了Python那洁净的规划,一旦你学会了Python,你就能主动的避开许多圈套。Python在其各组件之间有着最小的互动,这能有用的削减bug。它也具有非常简略的语法,这意味着在一开端你就有更小的概率犯错。当你实在是犯了错的时分,Python的即时过错检测和陈述能帮你敏捷的康复。
但用Python编程也不是个主动完结的活儿,许多事仍是要早做准备。那么废话不多说了,让咱们直切正题。在接下来的三节里咱们将这些过错分为语用、代码,以及编程三个大类。
假如你想读到更多的Python的常见过错以及怎样防止它们,那么在O’Reilly系列丛书的《Python学习手册》(原书第5版)里有具体的解读。
01 语用过错
让咱们从根底开端,从那些刚学习编程的人研究语法之前碰到的工作开端。假如你现已编过一些程了,那么以下这些或许看起来非常的简略;假如你从前尝试过教新手们怎样编程,它们或许就不这么简略了。
1. 在交互提示符中输入Python代码
在>>>交互提示符中你只能输入Python代码,而不是体系指令。经常有人在这个提示符下输入emacs,ls,或许edit之类的指令,这些可不是Python代码。
在Python代码中的确有办法来调用体系指令(例如os.system和os.popen),但可不是像直接输入指令这么直接。假如你想要在交互提示符中发动一个Python文件,请用import
file,而不是体系指令python file.py。
2. Print句子(只是)是在文件中需求
由于交互解说器会主动的讲表达式的成果输出,所以你不需求交互的键入完好的print句子。这是个很棒的功用,可是记住在代码文件里,一般你只有用print句子才干看得到输出。
3. 当心Windows里的主动扩展名
假如你在Windows里运用记事原本修改代码文件的话,当你坚持的时分当心挑选“一切文件”(All
Files)这个类型,而且清晰的给你的文件加一个.py的后缀。不然的话记事本会给你的文件加一个.txt的扩展名,使得在某些发动办法中无法跑这个程序。
更糟糕的是,像Word或许是写字板一类的文字处理软件还会默许的加上一些格局字符,而这些字符Python语法是不认的。
所以记住,在Windows下总是选“一切文件”(All
Files),并保存为纯文本,或许运用愈加“编程友爱”的文本修改东西,比方IDLE。在IDLE中,记住在保存时手动加上.py的扩展名。
4. 在Windows下点击图标的问题
在Windows下,你能靠点击Python文件来发动一个Python程序,但这有时会有问题。首要,程序的输出窗口在程序完毕的瞬间也就消失了,要让它不消失,你可以在文件最终加一条raw_input()的调用。其他,记住假如有错的话,输出窗口也就当即消失了。
要看到你的过错信息的话,用其他办法来调用你的程序:比方从体系指令行发动,经过提示符下用import句子,或许IDLE菜单里的选项,等等。
5. Import只在榜首次有用
你可以在交互提示符中经过import一个文件来运转它,可是这只会在一个会话中起一次效果;接下来的import只是是回来这个现已加载的模块。要想强制Python从头加载一个文件的代码,请调用函数reload(module)来到达这个意图。留意对reload请运用括号,而import不要运用括号。
6. 空白行(只是)在交互提示符中有效果
在模块文件中空白行和注释通通会被疏忽掉,可是在交互提示符中键入代码时,空白行表明一个复合句子的完毕。
换句话说,空白行告知交互提示符你完结了一个复合句子;在你真实完结之前不要键入回车。事实上当你要开端一个新的句子时,你需求键入一个空行来完毕当时的句子——交互提示符一次只运转一条句子。
02 代码过错
一旦你开端认真写Python代码了,接下来了一堆圈套就愈加风险了——这些都是一些跨言语特性的根本代码过错,并常常困扰不仔细的程序员。
7. 别忘了冒号
这是新手程序员最简略犯的一个过错:别忘了在复合句子的开端句子(if,while,
for等句子的榜首行)完毕的当地加上一个冒号“:”。或许你刚开端会遗忘这个,可是到了很快这就会成为一个下意识的习气。讲堂里75%的学生当天就可以记住这个。
8. 初始化变量
在Python里,一个表达式中的姓名在它被赋值之前是无法运用的。这是有意而为的:这样能防止一些输入失误,一起也能防止默许终究应该是什么类型的问题(0,None,””,[],?)。记住把计数器初始化为0,列表初始化为[],以此类推。
9. 从榜首列开端
保证把顶层的,未嵌套的代码放在最左面榜首列开端。这包含在模块文件中未嵌套的代码,以及在交互提示符中未嵌套的代码。Python运用缩进的办法来区别嵌套的代码段,因而在你代码左面的空格意味着嵌套的代码块。除了缩进以外,空格一般是被疏忽掉的。
10. 缩进共同
在同一个代码块中防止讲tab和空格混用来缩进,除非你知道运转你的代码的体系是怎样处理tab的。不然的话,在你的修改器里看起来是tab的缩进或许Python看起来就会被视作是一些空格。稳妥起见,在每个代码块中全都是用tab或许全都是用空格来缩进;用多少由你决议。
11. 在函数调用时运用括号
不管一个函数是否需求参数,你必需求加一对括号来调用它。即,运用function(),而不是function。Python的函数简略来说是具有特别功用(调用)的方针,而调用是用括号来触发的。像一切的方针相同,他们也可以被赋值给变量,而且直接的运用他们:x=function:x()。
在Python的培训中,这样的过错常常在文件的操作中呈现。一般会看到新手用file.close来封闭一个问题,而不是用file.close()。由于在Python中引证一个函数而不调用它是合法的,因而不运用括号的操作(file.close)无声的成功了,可是并没有封闭这个文件!
12. 在Import时不要运用表达式或许途径
在体系的指令行里运用文件夹途径或许文件的扩展名,但不要在import句子中运用。即,运用import mod,而不是import
mod.py,或许import dir/mod.py。
在实际情况中,这大概是初学者常犯的第二大过错了。由于模块会有除了.py认为的其他的后缀(例如,.pyc),强制写上某个后缀不仅是不合语法的,也没有什么含义。
和体系有关的目录途径的格局是从你的模块查找途径的设置里来的,而不是import句子。你可以在文件名里运用点来指向包的子目录(例如,import
dir1.dir2.mod),可是最左面的目录必须得经过模块查找途径可以找到,而且没有在import中没有其他途径格局。
不正确的句子import
mod.py被Python认为是要记在一个包,它先加载一个模块mod,然后企图经过在一个叫做mod的目录里去找到叫做py的模块,最终或许什么也找不到而报出一系列隐晦的过错信息。
13. 不要在Python中写C代码
以下是给不熟悉Python的C程序员的一些备忘贴士:
在if和while中条件测验时,不必输入括号(例如,if (X==1):)。假如你喜爱的话,加上括号也不妨,只是在这儿是彻底剩余的。
不要用分号来完毕你的句子。从技术上讲这在Python里是合法的,可是这毫无用处,除非你要把许多句子放在同一行里(例如,x=1; y=2;
z=3)。
不要在while循环的条件测验中嵌入赋值句子(例如,while ((x=next() !=
NULL))。在Python中,需求表达式的当地不能呈现句子,而且赋值句子不是一个表达式。
03 编程过错
下面总算要讲到当你用到更多的Python的功用(数据类型,函数,模块,类等等)时或许碰到的问题了。由于篇幅有限,这儿尽量精简,尤其是对一些高档的概念。要想了解更多的细节,敬请阅览《Python学习手册》。
14. 翻开文件的调用不运用模块查找途径
当你在Python中调用open()来访问一个外部的文件时,Python不会运用模块查找途径来定位这个方针文件。它会运用你供给的绝对途径,或许假定这个文件是在当时作业目录中。模块查找途径只是为模块加载服务的。
15. 不同的类型对应的办法也不同
列表的办法是不能用在字符串上的,反之亦然。一般情况下,办法的调用是和数据类型有关的,可是内部函数一般在许多类型上都可以运用。举个比如来说,列表的reverse办法只是对列表有用,可是len函数对任何具有长度的方针都适用。
16. 不能直接改动不行变数据类型
记住你无法直接的改动一个不行变的方针(例如,元组,字符串):
T = (1, 2, 3)
T[2] = 4 # 过错
用切片,联接等构建一个新的方针,并依据需求将本来变量的值赋给它。由于Python会主动收回没有用的内存,因而这没有看起来那么糟蹋:
T = T[:2] + (4,) # 没问题了: T 变成了 (1, 2, 4)
17. 运用简略的for循环而不是while或许range
当你要从左到右遍历一个有序的方针的一切元素时,用简略的for循环(例如,for x in
seq:)比较于根据while-或许range-的计数循环而言会更简略写,一般运转起来也更快。
除非你必定需求,尽量防止在一个for循环里运用range:让Python来替你处理标号的问题。鄙人面的比如中三个循环结构都没有问题,可是榜首个一般来说更好;在Python里,简略至上。
S = "lumberjack"
for c in S: print c # 最简略
for i in range(len(S)): print S[i] # 太多了
i = 0 # 太多了
while i < len(S): print S[i]; i += 1