|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果你想在以后的生涯中在软件行业工作的话,学习linux是一项基本技能,所以打从你打算学习linux那天起,放弃windows吧!因为它除了能给你带来片刻的娱乐,别无其他;
在这篇文章中,我将总结新老Python程序员常犯的一些毛病,以匡助你们在本人的事情制止犯一样或相似毛病。
起首我要申明一下的是,这些都是来历于第一手的履历。我以教学Python的常识为生。在已往的7年里,我已给上千论理学生教学上百堂Python的课程,同时看着这些先生们犯一样的错。也就是说,这些是我看着Python初学者活生生犯的错,千百次的错。现实上,这些毛病其实是太广泛了以致于我敢包管你刚入手下手学的时分是必定会犯的。
“那末是甚么呢?”你会问,“你也会在Python里犯那末多错么?”是的。Python多是最复杂、最天真的言语之一,但它毕竟仍是一门编程言语。它仍旧有语法,数据范例,和巫师蒂姆寓居的暗中角落。
(典故出自《蒙蒂派森与圣杯》中的邪术师蒂姆,他配角们指导在洞窟的墙壁上纪录的圣杯地位,作者在此处的意义是Python言语里简单出错的中央。另,Python言语得名于作者GuidovanRossum出格喜好的《蒙蒂派森航行马戏团(MontyPython’sFlyingCircus)》——译者注)
功德情是多亏了Python那洁净的计划,一旦你学会了Python,你就可以主动的避开良多圈套。Python在其各组件之间有着最小的互动,这能无效的削减bug。它也具有非常复杂的语法,这意味着在一入手下手你就有更小的几率出错。当你其实是犯了错的时分,Python的立即毛病检测和呈报能帮你敏捷的恢复。
但用Python编程也不是个主动完成的活儿,良多事仍是要早做筹办。那末空话未几说了,让我们直切正题。在接上去的三节里我们将这些毛病分为语用、代码,和编程三个年夜类。假如你想读到更多的Python的罕见毛病和怎样制止它们,那末在O’Reilly系列丛书的《LearningPython》里有具体的解读。(译注:LearningPython已是第五版了)
语用毛病
让我们从基本入手下手,从那些刚进修编程的人研究语法之前碰着的事变入手下手。假如你已编过一些程了,那末以下这些大概看起来非常的复杂;假如你已经实验过教老手们怎样编程,它们大概就不这么复杂了。
在交互提醒符中输出Python代码
在>>>交互提醒符中你只能输出Python代码,而不是体系命令。经常有人在这个提醒符下输出emacs,ls,大概edit之类的命令,这些可不是Python代码。在Python代码中的确有举措来挪用体系命令(比方os.system和os.popen),但可不是像间接输出命令这么间接。假如你想要在交互提醒符中启动一个Python文件,请用importfile,而不是体系命令pythonfile.py。
Print语句(仅仅)是在文件中必要
由于交互注释器会主动的讲表达式的了局输入,以是你不必要交互的键进完全的print语句。这是个很棒的功效,可是记着在代码文件里,一般你只要用print语句才干看失掉输入。
当心Windows里的主动扩大名
假如你在Windows里利用记事原本编纂代码文件的话,当你坚持的时分当心选择“一切文件”(AllFiles)这个范例,而且明白的给你的文件加一个.py的后缀。否则的话记事本会给你的文件加一个.txt的扩大名,使得在某些启动办法中没法跑这个程序。更糟的是,像Word大概是写字板一类的笔墨处置软件还会默许的加上一些格局字符,而这些字符Python语法是不认的。以是记得,在Windows下老是选“一切文件”(AllFiles),并保留为纯文本,大概利用加倍“编程友爱”的文本编纂工具,好比IDLE。在IDLE中,记得在保留时手动加上.py的扩大名。
在Windows下点击图标的成绩
在Windows下,你能靠点击Python文件来启动一个Python程序,但这偶然会有成绩。起首,程序的输入窗口在程序停止的刹时也就消散了,要让它不用掉,你能够在文件最初加一条raw_input()的挪用。别的,记着假如有错的话,输入窗口也就当即消散了。要看到你的毛病信息的话,用其余办法来挪用你的程序:好比从体系命令行启动,经由过程提醒符下用import语句,大概IDLE菜单里的选项,等等。
Import只在第一次无效
你能够在交互提醒符中经由过程import一个文件来运转它,可是这只会在一个会话中起一次感化;接上去的import仅仅是前往这个已加载的模块。要想强迫Python从头加载一个文件的代码,请挪用函数reload(module)来到达这个目标。注重对reload请利用括号,而import不要利用括号。
空缺行(仅仅)在交互提醒符中有感化
在模块文件中空缺行和正文一切会被疏忽失落,可是在交互提醒符中键进代码时,空缺行暗示一个复合语句的停止。换句话说,空缺行告知交互提醒符你完成了一个复合语句;在你真正完成之前不要键进回车。现实受骗你要入手下手一个新的语句时,你必要键进一个空行来停止以后的语句——交互提醒符一次只运转一条语句。
代码毛病
一旦你入手下手仔细写Python代码了,接上去了一堆圈套就加倍伤害了——这些都是一些跨言语特征的基础代码毛病,并经常困扰不仔细的程序员。
别忘了冒号
这是老手程序员最简单犯的一个毛病:别忘了在复合语句的肇端语句(if,while,for等语句的第一行)停止的中央加上一个冒号“:”。大概你刚入手下手会忘记这个,可是到了很快这就会成为一个下认识的习气。教室里75%的先生当天就能够记着这个。
初始化变量
在Python里,一个表达式中的名字在它被赋值之前是没法利用的。这是成心而为的:如许能制止一些输出掉误,同时也能制止默许事实应当是甚么范例的成绩(0,None,””,[],?)。记着把计数器初始化为0,列表初始化为[],以此类推。
从第一列入手下手
确保把顶层的,未嵌套的代码放在最右边第一列入手下手。这包含在模块文件中未嵌套的代码,和在交互提醒符中未嵌套的代码。Python利用缩进的举措来辨别嵌套的代码段,因而在你代码右边的空格意味着嵌套的代码块。除缩进之外,空格一般是被疏忽失落的。
缩进分歧
在统一个代码块中制止讲tab和空格混用来缩进,除非你晓得运转你的代码的体系是怎样处置tab的。不然的话,在你的编纂器里看起来是tab的缩进大概Python看起来就会被视作是一些空格。保险起见,在每一个代码块中全都是用tab大概全都是用空格来缩进;用几由你决意。
在函数挪用时利用括号
不管一个函数是不是必要参数,你必需要加一对括号来挪用它。即,利用function(),而不是function。Python的函数复杂来讲是具有特别功效(挪用)的对象,而挪用是用括号来触发的。像一切的对象一样,他们也能够被赋值给变量,而且直接的利用他们:x=function:x()。
在Python的培训中,如许的毛病经常在文件的操纵中呈现。一般会看到老手用file.close来封闭一个成绩,而不是用file.close()。由于在Python中援用一个函数而不挪用它是正当的,因而不利用括号的操纵(file.close)无声的乐成了,可是并没有封闭这个文件!
在Import时不要利用表达式大概路径
在体系的命令行里利用文件夹路径大概文件的扩大名,但不要在import语句中利用。即,利用importmod,而不是importmod.py,大概importdir/mod.py。在实践情形中,这也许是初学者常犯的第二年夜毛病了。由于模块会有除.py觉得的其他的后缀(比方,.pyc),强迫写上某个后缀不但是分歧语法的,也没有甚么意义。
和体系有关的目次路径的格局是从你的模块搜刮路径的设置里来的,而不是import语句。你能够在文件名里利用点来指向包的子目次(比方,importdir1.dir2.mod),可是最右边的目次必需得经由过程模块搜刮路径可以找到,而且没有在import中没有其他路径格局。不准确的语句importmod.py被Python以为是要记在一个包,它先加载一个模块mod,然后试图经由过程在一个叫做mod的目次里往找到叫做py的模块,最初大概甚么也找不到而报出一系列隐晦的毛病信息。
不要在Python中写C代码
以下是给不熟习Python的C程序员的一些备忘贴士:
- 在if和while中前提测试时,不必输出括号(比方,if(X==1):)。假如你喜好的话,加上括号也不妨,只是在这里是完整过剩的。
- 不要用分号来停止你的语句。从手艺上讲这在Python里是正当的,可是这毫无用途,除非你要把良多语句放在统一行里(比方,x=1;y=2;z=3)。
- 不要在while轮回的前提测试中嵌进赋值语句(比方,while((x=next()!=NULL))。在Python中,必要表达式的中央不克不及呈现语句,而且赋值语句不是一个表达式。
编程毛病
上面终究要讲到当你用到更多的Python的功效(数据范例,函数,模块,类等等)时大概碰着的成绩了。因为篇幅无限,这里只管精简,特别是对一些初级的观点。要想懂得更多的细节,敬请浏览LearningPython,2ndEdition的“小贴士”和“Gotchas”章节。
翻开文件的挪用不利用模块搜刮路径
当你在Python中挪用open()来会见一个内部的文件时,Python不会利用模块搜刮路径来定位这个方针文件。它会利用你供应的相对路径,大概假定这个文件是在以后事情目次中。模块搜刮路径仅仅为模块加载服务的。
分歧的范例对应的办法也分歧
列表的办法是不克不及用在字符串上的,反之亦然。一般情形下,办法的挪用是和数据范例有关的,可是外部函数一般在良多范例上都可使用。举个例子来讲,列表的reverse办法仅仅对列表有效,可是len函数对任何具有长度的对象都合用
不克不及间接改动不成变数据范例
记着你没法间接的改动一个不成变的对象(比方,元组,字符串):
1
2
T=(1,2,3)
T[2]=4#毛病
用切片,连接等构建一个新的对象,并依据需求将本来变量的值赋给它。由于Python会主动接纳没有效的内存,因而这没有看起来那末华侈:
1
T=T[:2]+(4,)#没成绩了:T酿成了(1,2,4)
利用复杂的for轮回而不是while大概range
当你要从左到右遍历一个有序的对象的一切元素时,用复杂的for轮回(比方,forxinseq:)比拟于基于while-大概range-的计数轮回而言会更简单写,一般运转起来也更快。除非你必定必要,只管制止在一个for轮回里利用range:让Python来替你办理标号的成绩。鄙人面的例子中三个轮回布局都没有成绩,可是第一个一般来讲更好;在Python里,复杂至上。
1
2
3
4
5
6
7
8
S="lumberjack"
forcinS:printc#最复杂
foriinrange(len(S)):printS#太多了
i=0#太多了
whilei<len(S):printS;i+=1 |
|