- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
附录B 各部分练习题的解答
1.交互。假设Python已正确配置,交互模式看起来应该就像这样(可以在IDLE或shell提示符下运行)。
2.程序。你的程序代码(即模块)文件module1.py和操作系统shell的交互看起来应该像这样:
同样,你也可以用其他方式运行:单击文件图标、使用IDLE的Run/Run Module菜单选项等。
3.模块。下面的交互说明了如何导入模块文件从而运行一个模块。
要记住,不停止和重启解释器时,需要重载模块才能再次运行它。把文件移到不同目录并导入它,是很有技巧性的问题:如果Python在最初的目录中产生module1.pyc文件,即使源代码文件(.py)已被移到不在Python搜索路径中的目录,导入该模块时,Python依然会使用这个pyc文件。如果Python可读取源代码文件的目录,就会自动写.pyc文件,.pyc文件包含模块编译后的字节码的版本。参考第3章有关模块的内容。
4.脚本。假设你的平台支持#!技巧,你的解法看起来应该像这样(虽然你的#!行可能需要列出机器上的另一路径):
5.错误。下面的交互模式(在Python 3.0下运行)示范了当你完成此练习题时会碰到的出错消息的种类。其实,你触发的是Python异常;默认异常处理行为会终止正在运行的Python程序,然后在屏幕上打印出错消息和堆栈的跟踪信息。堆栈的跟踪信息显示出当异常发生时,程序所处在的位置。在第七部分中,你会学到,可以使用try语句捕捉它,并进行任意的处理。你也会看到Python包含成熟的源代码调试器,从而可以满足特殊的错误检测的需求。就目前而言,程序错误发生时,Python会提供有意义的消息而不是默默地就崩溃了:
6.中断和循环。当你输入以下代码的时候:
会在Python中创建循环数据结构。在1.5.1版以前,Python打印不够智能,无法检测对象中的循环,而且会打印无止境的[1,2,[1,2,[1,2,[1,2,流,直到你按下机器上的中断组合键(从技术上来讲,就是引发键盘中断异常,并打印默认消息)。从Python 1.5.1起,打印已经足够智能,可以检测循环,并打印[[...]],而不是让你知道它已经在对象结构中检测到一个循环并避免永远打印。
循环的原因很微妙,而且需要第二部分的信息。但是,简而言之,Python中的赋值语句一定会产生对象的引用值,而不是它们的拷贝。你可以把对象看作是一块内存,把引用看作是隐式指向的指针。当你执行上面的第一个赋值语句时,名称L变成了对两个元素的列表对象的引用,也就是指向一段内存的指针。Python列表其实是对象引用值的数组,有一个append方法会通过在末尾添加另一个对象的引用,对数组进行原处修改。在这里,append调用会把L前面的引用加在L末尾,从而造成图B-1所示的循环:列表末尾的一个指针指回到列表的前面。
图 B-1 循环对象,通过把列表附加在自身而生成。在默认情况下,Python是附加最初的列表的引用值,而不是列表的拷贝
除了特殊的打印,正如我们在第6章中学习的,循环对象还必须由Python的垃圾收集器特殊处理,否则,当它们不再使用的时候,其空间将保持未回收。尽管这种情况在实际中很少见,但在一些遍历任意对象或结构的程序中,你必须通过记录已经遍历到哪里,从而检测这样的循环,以避免陷入循环。不管你相信与否,循环数据结构偶尔也会很有用的(但不包括打印的时候)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论