首页天道酬勤()

()

admin 12-01 04:46 160次浏览

(本期持续推出以Python官网文档为主线的系统学习Python系列文章或视频。欢迎有兴趣的朋友点击关注。在这里学习Python,事半功倍!除非另有说明,本文及后续文章均使用Windows平台作为演示平台,Python版本:3.8.1)

在前一篇文章中,我们已经进行了交互演示,但是当我们退出Python解释器并重新进入时,我们会发现之前的所有定义都丢失了。因此,除非需要交互或短暂的临时操作,否则在实践中更多地使用足迹运行模式(这种运行模式在上一篇文章中已经介绍过,参见Python学习入门(7)-开始编程)。在实际的程序开发中,随着程序变得越来越长,为了更好的可维护性,有必要将长脚本文件分割成更小的文件,并重用这些文件中的定义,以提高开发效率。为了支持这一点,Python提供了一种在脚本文件中定义这些定义的方法,并在其他脚本或解释器的交互模式中使用它们。这种包含定义的脚本文件称为模块,模块中的定义可以导入到其他模块或主模块中(在顶层执行的脚本和计算器模式中可以访问的一组变量)。

模块的创建

创建模块实际上是创建扩展名为的脚本文件。py,包含定义(变量定义、函数定义、类定义等。)这是需要做的。您可以使用任何文本编辑器来编辑该脚本文件。由于Python解释器默认解析UTF-8编码格式的脚本文件,建议您保存UTF-8编码格式的脚本文件。如果脚本文件不是UTF-8编码格式,则需要在文件开头以# -*- coding: encoding -*-的形式进行声明,其中encoding表示所使用的编码格式。例子如下:

[示例]模块定义

【注意】在示例中,创建了模块fib.py,并在其中定义了两个函数fib1和fib2,分别用于输出和返回斐波那契序列。此外,在末尾添加了一个if语句块,在模块作为脚本运行之前,该语句块不会被执行。

模块的导入和使用

在Python中,在使用模块之前,必须使用import命令来导入模块。导入命令有以下形式:

导入模块[作为mm]导入模块M,并将导入的名称指定为mm。其中指定导入模块的别名是可选的。从导入f1 [asff1],[f2 [as ff2]]从模块导入f1和f2,并分别指定导入的f1和f2的名称。您可以从一个模块导入多个名称,并且可以选择指定导入模块的别名。从导入*从模块中导入所有以下划线开头的名称。注意:一般来说,从模块或包中导入*不是一个好的做法,因为它通常会导致代码可读性差。但在交互操作模式下使用,减少输入工作量是可行的。直接包含在模块中的可执行语句将在模块导入时执行,例如示例模块中的print语句(‘这是定义斐波那契数列函数的模块’)。实际上,这种语句通常用于执行模块初始化。

例子如下:

[示例]模块的导入和使用

【注意】为了提高效率,每个模块在每个解释器会话中只导入一次。因此,如果模块发生变化,您必须重新启动解释器并重新导入该模块,或者如果它只是一个模块并且您想要交互测试,则可以使用importlib。Importlib.reload (modulename)命令重新导入(无需重新启动解释器)。

该模块作为脚本运行

如果模块中有if __name__=='__main__':语句块,当模块以脚本形式运行时,将执行该语句块中的语句。导入模块时不会执行这些语句。例子如下:

【示例】模块作为脚本运行

【注意】如果模块中使用的_ _ name _==' ___ main _ _' :语句块通常用于为模块提供方便的用户界面或用于测试目的(将模块作为脚本运行以执行测试套件)。

模块的搜索路径

当导入一个名为fib的模块时,解释器首先搜索一个具有该名称的内置模块。如果没有找到,它将在变量sys.path提供的目录列表中搜索一个名为fib.py的文件,如果没有找到,将报告一个错误。Sys.path由以下位置初始化:

输入包含脚本的目录(如果未指定文件,则输入当前目录)。环境变量PYTHONPATH。环境变量包含;分区的目录名与环境变量PATH的语法相同。安装时设置的默认值。值得注意的是,初始化后,Python会修改sys.path,将运行脚本的目录放在搜索路径的开头(标准库路径之前)。这意味着当加载模块时,目录中的模块将优先于库目录中同名的模块。如果不希望这样,就很难调整。

试的错误。

【注】在支持符号链接的文件系统中,脚本所在的包含符号链接的目录会被转换成实际目录后才会添加到模块搜索路径中。

已编译的Python文件

为了提升加载模块的速度,Python在目录_pycache__下将每个模块缓存为名为moduleName.version.pyc形式的编译文件,其中,moduleName为模块名,version为已编译文件的格式,通常为Python编译器名-版本号的形式。例如,在CPython 3.3版本中,m.py的已编译版本将被缓存为名为_pycache__/m.cpython-33.pyc的文件。这种命名约定允许来自不同版本的已编译模块一起共存。

Python通过对比已编译模块文件和源文件的修改日期来决定已编译模块文件是否已经过期,如果已编译模块文件的修改日期较早说明已过期需要重新编译。这是一个完全自动的过程。此外,已编译模块是平台独立的,因此可以在具有不同体系结构的系统之间共享相同的库。

Python在两种情况下不检查缓存。首先,对于直接从命令行加载的模块它总是重新编译并且不存储结果。其次,如果没有源模块,它不会检查缓存。要支持非源(仅编译)发行版,已编译模块必须位于源目录中,且不能有源模块。

在运行Python命令时如果使用了-O或-OO开关则可以减少已编译模块的大小。使用-O开关会删除assert语句,使用-OO开关会同时删除assert语句和_doc__字符串。由于一些程序可能依赖于这些功能,所以在确定不需要这些功能时再使用这些选项。优化了的模块会有一个opt标签,并且通常占用比较小的空间。未来的版本可能会改变优化的效果。

需要说明的是:从.pyc文件中读取程序并不比从.py文件中读取快,.pyc文件唯一的优势是加载速度较快。

如果需要为某个目录下的所有模块创建已编译模块(.pyc文件),则可以使用compileall模块提供的方法。具体使用方法在后续文章中会介绍。

[关于"模块"部分的内容本篇未完,下篇将继续讲解]

【结束】

计算机毕业设计ssm汽车租赁管理系统n5s69系统+程序+源码+lw+远程部署建库(Create Database) 数据仓库 UDW Doris云数据库 SQL Server UDBwinform模拟鼠标按键的具体实现无人化智能盒子 高温运行测试 UBox
python3.8.1安装教程(python3.8新特性) 合作博弈和演化博弈(演化博弈ESS)
相关内容