返回介绍

第五部分 练习题

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

参考附录B的“第五部分模块”的解答。

1.导入基础。编写一个程序计算文件中行数和字符数(类似于UNIX的wc)。利用文本编辑器,编写一个名为mymod.py的Python模块,导出三个顶层变量名。

·countLines(name)函数:读取输入文件,计算其中的行数(提示:file.readlines可为你做大多数工作,而剩下的事可以交给len来做)。

·countChars(name)函数:读取输入文件,计算其中的字符数(提示:file.read返回单个字符的字符串)。

·test(name)函数:调用两个计算的函数并给出输入文件名。这类文件名一般是通过传递进来、直接写出来、通过raw_input输入或者通过sys.argv列表从命令行获得。就目前而言,假设这是传递进来的函数参数。

这三个mymod函数预期应该有个文件名字符串会传入。如果每个函数输入的代码多于两三行,那就太费劲了:使用本书提示!

接着,在交互模式下测试模块,使用导入和变量名点号运算来读取导出的变量名。PYTHONPATH需要引入创建的mymod.py所在的目录吗?试着让模块对自身运行。例如,test("mymod.py")。注意:这个测试打开了文件两次;如果你志向远大,可以通过传入一个已开启的文件对象给那两个计算函数来改进它[提示:file.seek(0)是文件回滚]。

2.from/from*。使用from直接加载导出变量名,通过交互模式测试练习题1的mymod模块,先通过变量名导入,然后使用from*来获取所有。

3.__main__。在mymod模块中加入一行,只有在模块通过脚本运行时(而不是在其被导入时),才自动调用test函数。你加入的行可能会测试__name__的值是否为字符串"__main__",就像这一章所演示过的一样。试着从系统命令行运行模块。然后导入该模块,以交互模式测试其函数。两种模式都能用吗?

4.嵌套导入。写第二个模块myclient.py导入mymod,并测试其函数。然后,从系统命令行执行myclient。如果myclient使用from取出mymod,mymod的函数可以从myclient的顶层存取吗?如果改用import导入是什么情况呢?试着在myclient中编写这两种形式,并导入myclient,在交互模式下查看其__dict__属性。

5.包导入。从包导入文件。在模块导入搜索路径上的一个目录中创建名为mypkg的子目录,把练习题1或3所创建的mymod.py模块文件移到这个新目录下,然后试着以import mypkg.mymod形式导入。

你需要在模块移入的目录中添加__init__.py文件才行,但是在所有主要Python平台上应该都能工作(这是Python使用“.”作为路径分隔字符的一部分原因)。创建的包目录可以是正在运行的目录底下的子目录。如果是这样,就可通过搜索路径的主目录元素找到,而不用去配置路径。加一些代码到__init__.py,并观察这些代码在每次导入时是不是都会运行。

6.重载。用模块实验重载:运行第22章changer.py例子的测试,重复修改被调用的函数的消息和行为,而不停止Python解释器。这取决于你的系统,你可能可以在另一个窗口编辑changer,或者暂停Python解释器,在相同的窗口中编辑(在UNIX上,Ctrl+Z通常会挂起当前的进程,而fg命令可使其重新恢复)。

7.循环导入[1]。在递归导入陷阱那一节中,导入recur1会引发错误。但是,如果重启Python,通过交互模式导入recur2,则不会发生错误,自行测试并查看结果。为什么导入recur2正常工作,而recur1则行不通?[提示:Python在运行新模块的代码前,会先将新模块保存在内置的sys.modules表内(一个字典);稍后的导入会先从这个表中取出该模块,无论该模块是否“完整”。]现在,试着以顶层脚本执行recur1:python recur1.py。你是否得到和交互模式导入recur1时相同的错误?为什么?(提示:当模块以程序执行时,不是被导入,所以这种情况下和通过交互模式导入recur2是一样的效果;recur2是最先导入的模块。)当你把recur2当成脚本运行时,发生了什么?

[1]注意:循环导入在实际中很罕见。事实上,在作者十年Python代码编写的经验中,从未编写过或遇到过循环导入。另一方面,如果你了解为什么这是潜在的问题,那么你已经很好地掌握了Python的导入含义了。

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

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

发布评论

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