《Python程序设计案例教程》-课后习题答案第5章

本文详细解析了Python编程中模块的导入过程、模块对象的生成、PYTHONPATH的作用、模块导入路径结构、from和import的区别、命名空间管理、模块创建与重载、以及包和_init_.py文件的用途。特别强调了from语句的潜在陷阱和正确使用import的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《Python程序设计案例教程》-课后习题答案第5章

5  习题解答

1.模块源代码文件是怎样变成模块对象的?

模块的源代码文件在模块导入时,就会自动生成模块对象。从技术角度来讲,模块的源代码会在导入时运行,一次一条语句,而在这个过程中赋值的所有变量名都会生成模块对象的属性。

2.为什么需要设置PYTHONPATH环境变量?

只需设置PYTHONPATH,从而可以从正在用的目录(也就是正在交互模式下使用的当前目录,或者包含顶层文件的目录)以外的其他目录进行导入。

3.举出模块导入搜索路径的四个主要组件。

模块导入搜索路径的四个主要组件是顶层脚本的主目录(包含该文件的目录)、列在PYTHONPATH环境变量中的所有目录,标准链接库目录以及位于标准位置中.pth路径文件中的所有目录。其中,程序员可以定制PYTHONPATH和.pth文件。

4.举出Python可能载入的能够响应import操作的四种文件类型。

Python可能载入源代码文件(.py)、字节码文件(.pyc)、C扩展模块(例如,Linux的.so文件,以及Windows的.dll或.pyd)以及相同变量名的目录(用于包含人)。导入也可以加载更罕见的东西,例如,ZIP文件组件、Python Jython版的Java类、IronPython的.NET组件以及没有文件形式的静态连接C扩展。有了导入钩子,导入可以加载任何东西。

5.什么是命名空间?模块的命名空间包含了什么?

命名空间是一种独立完备的变量包,而变量就是命名空间对象的属性。模块的命名空间包含了代码在模块文件顶层赋值的所有变量名(也就是没有嵌套于def或class语句中)。从技术角度上来讲,模块的全局作用域会变成模块对象的属性命名空间。模块的命名空间也会将其导入的其他文件中所做的赋值运算而发生变化,不过这不值得鼓励。

6.怎样创建模块?

要创建模块时,只需编写一个包含Python语句的文本文件就可以了,每个原代码文件都会自动成为模块,而且也没有语法用来声明模块。导入操作会把模块文件加载到内存中使其成为模块对象。你可以用C或Java这类外部语言编写代码来创建模块。

7.from语句和import语句有什么关系?

from语句是导入整个模块,就像import语句那样,但是还有个步骤,就是会从被导入的模块中,复制一个或多个变量到from语句所在的作用域中。这样可以让你直接使用被导入的变最名(name),而不是通过模块来使用变量名(module.name)。

8.reload函数和导入有什么关系?

默认,模块是每个进程只导入一次。reload函数会强制模块再次被导入。这基本上都是用于开发过程中选取模块源代码的新版本,或者用在动态定制的场景中。

9.什么时候必须使用import,不能使用from?

当需要读取两个不同模块中的相同变量名时,就必须使用import,而不能用from;因为你必须制定变量名所在模块,从而保证这两个变量名是独特的。

10.请列举出from语句的三种潜在陷阱。

from语句会让变量含义模糊(究竟是哪个模块定义的),通过reload调用时会有问题(变量名还是引用对象之前的版本),而且会破坏命名空间(可能悄悄覆盖正在作用域中使用的变量名)。from*形式在多数情况下都很糟糕:它会严重地污染命名空间,让变量意义变得模糊,少用为妙。

11.模块包目录内的_init_.py文件有何用途?

_init_.py文件是用于声明和初始化模块包的。第一次在进程中导人某目录时,Python会自动运行这个文件中的代码。其赋值的变量会变成对应于该目录在内存中所创建的模块对象的属性。它不是选用的:如果一个目录中没有包含这个文件的话,是无法通过包语法导入目录的。

12.每次引用包的内容时,如何避免重复包的完整路径?

通过from语句使用包,直接把包的变量名复制出来,或者使用import语句的as扩展功能,把路径改为较短的别名。在这种情况下,路径只出现在了一个地方,就在from或import语句中。

13.哪些目录需要_init_.py文件?

import或from语句中所列出的每个目录都必须含有_init_ py.文件。其他目录则不需要包含这个文件,包括含有包路径最左侧组件的目录。

14.在什么情况下必须通过import而不能通过from使用包?

只有在你需要读取定义在一个以上路径的相同变量名时,才必须通过import来使用包,而不能使用from。使用import,路径可让引用独特化,然而,from却让任何变变量名有一个版本。

15.from mypkg import spam和from.import spam有什么差别?

from mypkg import spam是绝对导入:mypkg的搜索掠过包路径并且mypkg位于sys.path中的一个绝对目录中。另一方面,from.import spam是相对导入:spam的查找是相对于该语句所在的包,然后才会去搜索sys.path。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李威威wiwi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值