本文概述
作为一个初学者, 你开始在解释器上使用Python, 稍后在需要编写更长的程序时, 就开始编写脚本。随着程序大小的增加, 你可能需要将其拆分为多个文件, 以便于维护和代码的可重用性。解决方案是模块。你可以在模块中定义最常用的函数并将其导入, 而不是将其定义复制到其他程序中。可以由另一个程序导入模块以利用其功能。这也是你可以使用Python标准库的方式。
简而言之, 模块是由Python代码组成的文件。它可以定义函数, 类和变量, 还可以包含可运行的代码。任何Python文件都可以作为模块引用。包含Python代码的文件, 例如:test.py, 被称为模块, 其名称为test。
编写模块的方法有很多种, 但是最简单的方法是创建一个扩展名为.py的文件, 其中包含函数和变量。
在开始编写自己的模块之前, 建议你阅读我们的Python数据科学入门课程, 该课程涵盖Python编程语言的基础知识。
本教程将指导你编写自己的Python模块。你将学习以下主题:
- Python中的import语句
- 编写模块
- 有关进口声明的更多信息
- 模块搜索路径
- 字节编译文件
- dir()函数
要使用任何模块中提供的功能, 必须将其导入当前程序。你需要将import关键字与所需的模块名称一起使用。当解释器遇到导入语句时, 它将模块导入到当前程序中。你可以通过使用点(。)运算符以及模块名称来使用模块内部的功能。首先, 让我们看看如何使用标准库模块。在下面的示例中, 数学模块被导入到程序中, 因此你可以使用其中定义的sqrt()函数。
import math #You need to put this command, `import` keyword along with the name of the module you want to import
num = 4
print(math.sqrt(num)) #Use dot operator to access sqrt() inside module "math"
出于效率原因, 每个模块在每个解释器会话中仅导入一次。因此, 如果你更改模块, 则必须重新启动解释器;如果它只是你要进行交互测试的一个模块, 请使用reload(), 例如:reload(module_name)。
现在你已经了解了如何在程序中导入模块, 是时候编写自己的模块并在另一个程序中使用它了。编写模块就像编写其他任何Python文件一样。让我们开始编写一个函数, 以在文件Calculation.py中添加/减去两个数字。
def add(x, y):
return (x+y)
def sub(x, y):
return (x-y)
如果尝试在命令行上执行此脚本, 则不会发生任何事情, 因为你尚未指示程序执行任何操作。在名称为module_test.py的同一目录中创建另一个python脚本, 并将以下代码写入其中。
import calculation #Importing calculation module
print(calculation.add(1, 2)) #Calling function defined in add module.
如果执行module_test.py, 你将看到” 3″作为输出。当解释器遇到import语句时, 它在代码中导入了计算模块, 然后通过使用点运算符可以访问add()函数。
Tere是导入模块的更多方法:
- from..import语句
- from.. import *语句
- 重命名导入的模块
from..import语句
from..import语句允许你从模块中导入特定的函数/变量, 而不是导入所有内容。在上一个示例中, 当你将计算导入到module_test.py中时, add()和sub()函数均被导入。但是, 如果仅在代码中需要add()函数, 该怎么办?
这是一个示例, 说明from..import的用法
from calculation import add
print(add(1, 2))
在上面的示例中, 仅add()函数被导入和使用。注意使用add()吗?你现在可以直接访问它, 而无需使用模块名称。你也可以导入多个属性, 在import语句中用逗号分隔。看下面的例子:
from calculation import add, sub
from.. import *语句
你可以使用此语句导入模块的所有属性。这将使导入模块的所有属性在代码中可见。
这是一个示例, 用于说明from .. import *的用法:
from calculation import *
print(add(1, 2))
print(sub(3, 2))
请注意, 在专业领域中, 应避免使用from..import和from..import *, 因为这会使代码的可读性降低。
重命名导入的模块
你可以重命名要导入的模块, 这在你想为模块提供更有意义的名称或模块名称太大而无法重复使用时非常有用。你可以使用as关键字对其重命名。以下示例说明了如何在程序中使用它。
import calculation as cal
print(cal.add(1, 2))
通过将计算重命名为cal, 你节省了一些键入时间。
请注意, 由于你的程序不再能够识别计算, 因此你现在不能再使用calculation.add(1, 2)。
你可能需要模块在不同的程序/项目中使用, 并且它们在目录中的物理位置可能不同。如果要使用其他目录中的模块, 则可以使用Python提供的一些选项。
导入名为计算的模块时, 解释器首先搜索具有该名称的内置模块。如果未找到, 那么它将在变量sys.path给出的目录列表中搜索名为Calculation.py的文件。
sys.path包含以下位置:
- 包含输入脚本的目录(或当前目录)。
- PYTHONPATH(目录名称列表, 语法与shell变量PATH相同)。
- 取决于安装的默认值。
假设module_test.py在/ home / srcmini /目录中, 并且你将Calculation.py移到了/ home / test /。你可以修改sys.path以将/ home / test /包含在路径列表中, Python解释器将在该路径中搜索模块。为此, 你需要通过以下方式修改module_test.py:
import sys
sys.path.append('/home/test/')
import calculation
print(calculation.add(1, 2))
导入模块会增加程序的执行时间, 因此Python有一些技巧来加快它的速度。一种方法是创建扩展名为.pyc的字节编译文件。
在内部, Python将源代码转换为称为字节码的中间形式, 然后将其转换为计算机的本地语言, 然后运行它。下次从其他程序导入模块时, 此.pyc文件很有用-由于已完成了导入模块所需的部分处理, 因此它会更快。同样, 这些字节编译的文件与平台无关。
请注意, 这些.pyc文件通常与相应的.py文件位于同一目录中。如果Python没有写该目录中文件的权限, 则不会创建.pyc文件。
dir()函数用于查找模块中定义的所有名称。它返回包含模块中定义的名称的字符串排序列表。
import calculation
print(test.add(1, 2))
print(dir(calculation))
输出如下:
[‘__builtins __’, ‘__ cached __’, ‘__ doc __’, ‘__ file __’, ‘__ loader __’, ‘__ name __’, ‘__ package __’, ‘__ spec __’, ‘add’, ‘sub’]
在输出中, 你可以看到在模块add&sub中定义的函数的名称。属性__name__包含模块的名称。所有以下划线开头的属性都是与模块关联的默认python属性。
需要创建模块才能更好地管理代码和可重用性。 Python为你提供了一些内置模块, 可以使用import关键字将其导入。 Python还允许你创建自己的模块, 并在程序中使用它们。它为你提供了字节编译的文件, 从而克服了使用模块的成本, 从而使执行速度更快。你可以使用dir()来了解在程序中使用的模块中定义的属性, 这既可以在预定义模块中使用, 也可以在用户定义模块中使用。
如果你想了解有关Python的更多信息, 可以看看我们的数据科学中级Python课程。
评论前必须登录!
注册