python 模块和文件

133 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情


python 模块和文件

到目前为止,我们的操作假设是:

1)我们的整个程序都存储在一个文件中,

2)我们的程序不依赖于以前编写的代码(除了实现Python的代码),

3)我们的程序不访问以前收集的数据,也不以允许在程序运行完成后访问它们的方式存储其结果。

只要程序很小,第一个假设是完全合理的。但是,随着程序变大,将它们的不同部分存储在不同的文件中通常更方便。例如,想象一下,多个人正在处理同一个程序。如果他们都试图更新同一个文件,那将是一场噩梦。在第 7.1 节中,我们讨论了一种机制,即 Python 模块,它允许我们从多个文件中的代码轻松构造程序。第二和第三个假设对于旨在帮助人们学习编程的练习是合理的,但在编写旨在完成有用内容的程序时很少合理。在第 7.2 节中,我们展示了如何利用作为标准 Python 发行版一部分的库模块。我们在本章中使用了其中的几个模块,并在本书后面使用了许多其他模块。第 7-3 节简要介绍了在文件中读取和写入数据。

模块

模块是包含 Python 定义和语句的.py文件。例如,我们可以创建一个文件 circle.py 其中包含图 7-1 中的代码。

image.png

程序通过导入语句访问模块。因此,例如,代码

image.png

将打印

image.png

模块通常存储在单独的文件中。每个模块都有自己的私有符号表。因此,在 circle.py 我们以通常的方式访问对象(例如,pi和面积)。执行导入 M 会在显示导入的作用域中为模块 M 创建绑定。因此,在导入上下文中,我们使用点表示法来表示我们指的是导入模块中定义的名称.46 例如,在 circle.py 之外,引用 pi 和 circle.pi 可以(在本例中确实)引用不同的对象。

乍一看,使用点符号似乎很麻烦。另一方面,当导入模块时,人们通常不知道在实现该模块时可能使用了哪些本地名称。使用点表示法完全限定名称可避免因意外名称冲突而烧毁的可能性。例如,在圆圈模块外部执行赋值 pi = 3 不会更改圆圈模块中使用的 pi 值。

正如我们所看到的,模块可以包含可执行语句以及函数定义。通常,这些语句用于初始化模块。因此,模块中的语句仅在模块首次导入程序时执行。此外,每个解释器会话仅导入一次模块。如果启动控制台,导入模块,然后更改该模块的内容,解释器仍将使用该模块的原始版本。这可能会导致调试时出现令人费解的行为。如有疑问,请启动新的外壳。

import 语句的一个变体,它允许导入程序在访问导入模块内定义的名称时省略模块名称。从 M 导入执行语句

  • 在当前范围内创建绑定到 M 中定义的所有对象,但不创建绑定到 M 本身。例如,代码

image.png

将首先打印 3.14159,然后生成错误消息名称错误:

image.png

许多Python程序员对使用这种“通配符”导入感到不满。他们认为,这使得代码更难阅读,因为在定义名称(例如上述代码中的 pi)的位置不再明显。

导入语句的常用变体是

image.png

这将指示解释器导入名为 module_name 的模块,但将其重命名为new_name。这在以下情况下很有用:

module_name已用于导入程序中的其他内容。程序员使用此表单的最常见原因是提供长名称的缩写。