- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
常见编写代码的陷阱
·别忘了冒号。一定要记住在复合语句首行末尾输入“:”(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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论