返回介绍

常见编写代码的陷阱

发布于 2024-01-29 22:24:16 字数 2178 浏览 0 评论 0 收藏 0

在做本书这一部分的练习题前,我们来看一下初学者编写Python语句和程序最常犯的一些错误。很多都是本书之前已经提出过的警告,写在这里只是为了方便参考而已。一旦你有一些Python代码的编写经验后,就会懂得避开这些陷阱,但是现在一些内容可能有帮助你避免一开始就掉在这些陷阱中。

·别忘了冒号。一定要记住在复合语句首行末尾输入“:”(if、while、for等的第一行)。你可能一开始会忘记(我就忘过,过去几年我那3000多位学生多数也会),但是,这很快就会变成无意识的习惯,所以你大可放心。

·从第1行开始。要确定顶层(无嵌套)程序代码从第1行开始。这包括在模块文件中输入的无嵌套的代码,以及在交互模式提示符下输入的无嵌套的代码。

·空白行在交互模式提示符下很重要。模块文件中复合语句内的空白行都会被忽视,但是,当你在交互模式提示符下输入代码时,空白行则是会结束语句。换句话来说,空白行是告诉交互模式命令行,你已完成复合语句;如果你想继续,就不要在...提示符下(或IDLE中)按Enter键,直到完成为止。

·缩进要一致。避免在块缩进中混合制表符和空格,除非你知道文字编辑器如何处理制表符。否则,如果编辑器把制表符也算成空格,你在编辑器中所见到的就不一定是Python所见到的。对任何块结构的语言来说都是如此,不仅仅是Python而已:如果下一位程序员对制表符有不同的设置,他就无法了解代码的结构。每个块全都使用制表符或空格,这样比较安全。

·不要在Python中写C代码。给C/C++程序员的提醒:在if和while首行,不用再测试两侧输入括号(例如,if(X==1):)。如果喜欢,你也可以这么做(任何表达式都可包含在括号中),但是在这种环境下完全是多余的。此外,不要以分号终止所有的语句。在Python中,这么做在技术上也是合法的。但是完全没用,除非把一个以上的语句放在同一行中(每行的结尾通常就是该语句的终结)。此外,记住不要在while循环测试中嵌入赋值语句,而且不要在块周围使用{}(改为一致地缩进嵌套程序代码块)。

·使用简单的for循环,而不是while或range。另一件要提醒的事:比起while或者range式的计数器循环来讲,简单的for循环(例如,for x in seq:)总是比较容易写,运行起来也更快。因为Python会在内部为简单的for循环处理索引运算,因此有时会比等效的while快两倍。避免在Python中做计算的诱惑!

·要注意赋值语句中的可变对象。在第11章介绍过:在多重目标赋值语句中(a=b=[]),以及在增强指定语句中(a+=[1,2]),使用可变对象时,要小心一点。在这两种情况下,在原处的修改会影响其他变量。参考第11章的内容。

·不要期待在原处修改对象的函数会返回结果。我们以前也碰过这一点:像第8章介绍过的list.append和list.sort方法这种的修改运算,并不会有返回值(除了None)。所以在调用时不要对其结果进行赋值。初学者写出mylist=mylist.append(X)这样的语句,试着取得append的结果,结果却实际把my list指定为None,而不是修改后的列表,这种事并非不常见(事实上,你会完全失去该列表的引用值)。

当你尝试以排序的方式遍历字典元素时,Python 2.X的代码中会有更复杂的例子,例如,for k inD.keys().sort():这类代码。用keys方法建立键列表,而sort方法可以用来排序。但是因为sort方法返回None,循环就失败了,因为最后变成一个None(而不是序列)的循环。即便早期在Python 3.0中的时候,这也会失效,因为字典键是视图而不是列表。要正确编写这段代码,可以使用较新的sorted内置函数,来返回排序后的列表,也可以把方法调用放在外边:先执行Ks=list(D.keys()),然后执行Ks.sort(),最后执行k in Ks:。这是你想明确调用keys方法来进行循环运算的一种情况,而不是依靠字典迭代器,迭代器不会排序。

·一定要使用括号调用函数。必须在函数名称后面加括号才能对它进行调用,无论它是否带有参数[例如,使用function(),而不是function]。在第四部分中,你会发现,函数也是对象,只是有特殊的运算——你通过括号触发对它的调用。

从分类上看,这个问题似乎在文件上最常发生;初学者经常输入file.close来关闭文件,而不是file.close()。因为引用函数而不是对它调用也是合法的,第一个没有括号的版本也会成功,但是它并没有关闭文件。

·不要在导入和重载中使用扩展名或路径。在import语句中省略目录路径和文件字尾(例如,要写import mod,而不是import mod.py)。(我们在第3章讨论过模块的基础,而第五部分会继续研究模块)。因为模块可能有.py以外的其他后缀名(例如,.pyc),硬编码的后缀名不仅是不合法的语法,也说不通。任何平台特定的目录路径语法是属于模块搜索路径设置的,而不是import语句。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文