Python 模块
函数是一段有组织、可重用的代码块,用于执行一个单独且相关的操作。函数能够为您的应用程序提供更好的模块性,以及高度的代码重用性。
Python中的模块的概念进一步增强了模块化。您可以一起定义多个相关函数并加载所需的函数。模块是一个包含函数、类、变量、常量或任何其他Python对象定义的文件。该文件的内容可以提供给任何其他程序使用。Python使用import关键字来实现这个目的。
示例
它将产生以下的 输出 -
内置模块
Python的标准库附带了许多模块。它们被称为内置模块。其中大多数内置模块都是用C语言编写的(因为Python的参考实现是C语言),并且预编译成库。这些模块提供了诸如特定于系统的操作系统管理、磁盘IO、网络等有用的功能。
下面是一些选择的内置模块列表:
编号 | 名称与简要描述 |
---|---|
1 | os 该模块提供了一种统一的接口,用于执行一些操作系统功能。 |
2 | string 该模块包含一些用于字符串处理的函数。 |
3 | re 该模块提供了一组强大的正则表达式功能。正则表达式(RegEx)允许对字符串进行强大的搜索和匹配。 |
4 | math 该模块实现了一些浮点数的数学运算。这些函数通常是对平台C库函数的简单封装。 |
5 | cmath 此模块包含一些用于复数的数学运算。 |
6 | datetime 此模块提供处理日期和一天内时间的函数。它封装了C运行时库。 |
7 | gc 此模块提供对内置垃圾收集器的接口。 |
8 | asyncio 此模块定义了用于异步处理所需的功能。 |
9 | Collections 此模块提供了高级容器数据类型。 |
10 | Functools 此模块具有高阶函数和可调用对象的操作。在函数式编程中有用。 |
11 | operator 标准运算符对应的函数。 |
12 | pickle 将Python对象转换为字节流,反之亦然。 |
13 | socket 底层网络接口。 |
14 | sqlite3 使用SQLite 3.x的DB-API 2.0实现。 |
15 | statistics 数学统计函数。 |
16 | typing 支持类型提示。 |
17 | venv 创建虚拟环境。 |
18 | json 将 JSON 格式进行编码和解码。 |
19 | wsgiref WSGI 工具和参考实现。 |
20 | unittest Python 的单元测试框架。 |
21 | random 生成伪随机数。 |
自定义模块
任何扩展名为.py并包含Python代码的文本文件都可以看作是一个模块。它可以包含一个或多个函数、变量、常量以及类的定义。通过import语句,来自模块的任何Python对象都可以在解释器会话或另一个Python脚本中使用。模块还可以包括可运行的代码。
创建一个模块
创建一个模块就是使用任何编辑器保存Python代码。让我们将以下代码保存为 mymodule.py
你现在可以在当前的Python终端中导入mymodule。
您还可以在另一个Python脚本中导入一个模块。将以下代码保存为example.py
在命令终端中运行此脚本
import 语句
在Python中, import 关键字被提供用于从一个模块中加载一个Python对象。该对象可以是一个函数、类、变量等。如果一个模块包含多个定义,所有的定义都会加载到命名空间中。
让我们将以下代码保存在一个名为 mymodule.py 的文件中,该文件包含三个函数。
导入 mymodule 模块的语句将此模块中的所有函数加载到当前命名空间中。导入的模块中的每个函数都是此模块对象的属性。
要调用任何函数,请使用模块对象的引用。例如,mymodule.sum()。
它将产生以下 输出 −
from ... import
语句
import 语句将在当前名称空间加载模块的所有资源。可以使用此语法从模块中导入特定对象。例如,
在 mymodule 中有三个函数,但在以下可执行脚本 example.py 中只导入了两个。
它将产生以下输出 −
注意,函数不需要通过模块的名称来调用。
使用from...import *
语句
还可以通过使用以下import语句将模块中的所有名称导入当前命名空间。
这提供了一种简单的方法,可以将一个模块中的所有项目导入到当前命名空间中;但是,应该谨慎使用此语句。
import ... as
语句
您可以为导入的模块指定一个别名。
调用函数时应在前缀中加上 别名 。
看以下 示例 −
模块属性
在Python中,一个模块是一个模块类的对象,因此具有属性。
以下是模块的属性:
- file返回模块的物理名称。
-
package返回模块所属的包。
-
doc返回模块顶部的文档字符串(如果有的话)。
-
dict返回模块的整个作用域。
-
name返回模块的名称。
示例
假设以下代码保存为 mymodule.py
将下面的英文翻译成中文,不解释,保留HTML格式:
让我们通过在以下脚本中导入mymodule来检查其属性−
它将产生以下的 输出 −
name 属性
Python 模块的__name__
属性非常重要。让我们更详细地探讨一下。
在交互式 Shell 中,__name__
属性返回 ‘main‘
如果您在解释器会话中导入任何模块,则该模块的__name__
属性返回模块的名称。
从Python脚本内部,__name__
属性返回’main‘
在命令终端中运行此命令-
该属性允许将Python脚本用作可执行文件或模块。与C++、Java、C#等不同,在Python中,没有main()函数的概念。扩展名为.py的Python程序脚本可以包含函数定义和可执行语句。
保存 mymodule.py 文件,并使用以下代码:
你可以看到sum()函数是在定义它的同一脚本中调用的。
现在让我们在另一个脚本中导入这个函数
example.py .
它将产生以下 输出 −
输出“sum:30”出现了两次。一次是在导入mymodule模块时,导入的模块中的可执行语句也会运行。第二次输出来自调用脚本,即 example.py 程序。
我们希望的是当导入一个模块时,只导入函数,不运行可执行语句。可以通过检查__name__
的值来实现。如果是__main__
,表示正在运行而不是被导入。有条件地包含可执行语句,比如函数调用。
在 mymodule.py 中添加 if 语句,如下所示-
现在如果你运行 example.py 程序,你会发现输出的和为30只出现一次。
reload()函数
有时候,在Python的交互式解释器会话中工作时,您可能需要重新加载一个模块。
假设我们有一个名为test.py的测试模块,并且有以下函数:
我们可以从Python提示符中导入该模块并调用其函数,如下所示:
然而,假设您需要修改SayHello()函数,比如 –
即使您编辑并保存test.py文件,加载到内存中的函数也不会更新。您需要使用imp模块中的reload()函数重新加载它。