返回介绍

附录B 各部分练习题的解答

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

参考第3章 第一部分 练习题 中的习题。

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 技术交流群。

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

发布评论

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