本文共 4037 字,大约阅读时间需要 13 分钟。
假设您正在使用python解释器。您花了30分钟来定义一个函数,然后使用它并退出解释器。但是突然间,您记住仍然需要再次使用该功能。您再次输入它,但该功能的定义已消失。哎呀,好痛。
现在,您再次需要花费30分钟来键入相同的功能。因此,python有一种方法可以将该函数定义放入文件中并随时使用。
模块是ModuleType类型的对象。该模块基本上是一个python文件(扩展名为的文件.py
),其中包含定义和语句(例如:类,函数,变量等)。Python中的模块为我们提供了逻辑上组织代码的灵活性。我们使用模块将大型程序分解为小的可管理文件。我们可以在模块中定义函数或类,然后使用来在其他模块中重用它们import
。Python本身带有很多模块,例如数学,迭代工具,集合等。
示例:让我们创建一个模块。在文件中键入以下函数,并将其另存为utils.py
。
### utils.py def multiplication(a: int, b: int)-> int: """This function will return the multiplication of two integers""" return a * b
因此,我们在名为utils的模块中定义了一个名为乘法的函数。
我们可以使用关键字将模块内的定义导入另一个模块import
。Python提供了两种导入模块的方法,如下所示:
import module_name
from module_name import name1, name2...
示例:让我们将utils模块导入另一个名为 operations.py
### operations.pyimport utilsresult = utils.multiplication(2, 4)print(result)>>> 8
当我们在操作模块中导入utils时,它不会直接将utils模块内部定义的对象加载到Operations模块中。相反,它将仅在当前模块名称空间中加载模块名称(utils)。要使用utils定义的函数或类,我们必须使用上面示例()中所示的表示法。如果您尝试直接使用乘法,则python会抛出如下所示的异常:dot (.)
utils.multiplication(2, 4)
>>> import utils>>> multiplication(2,3)Traceback (most recent call last): File "", line 1, in NameError: name 'multiplication' is not defined
如果要将特定功能或定义从模块导入其他模块,则必须使用from module_name import name
。
### operations.pyfrom utils import multiplicationresult = multiplication(2, 4)print(result)>>>8
注意:Python还允许我们使用as关键字为导入别名,如下所示:
import modulename as somename
from modulename import name as somename
。例:
### operations.py# import utils as ufrom utils import multiplication as mul# result = u.multiplication (2,4)result = mul(2, 4)print(result)>>>8
注意:我们可以使用import *
或from .. import *
导入特定模块中的所有对象。
例:
### operations.pyfrom utils import *result = multiplication(2, 4)print(result)>>>8
注意:我们可以使用该dir()
函数找出模块内定义的对象。
>>> import utils>>>dir(utils)['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'multiplication']
在这里,我们可以看到名称列表(以及乘法)。所有以下划线开头的名称都是与模块关联的默认Python属性。例如,__name__
存储模块的名称并__file__
存储其所在模块的路径。
>>>import utils>>>utils.__name__ # name of the module'utils'>>>utils.__file__ # module path'C:\\Users\\user\\Desktop\\python_practice\\utils.py'
Python使用了一个相对复杂的系统来查找和加载模块。该sys
模块具有一些属性,这些属性定义Python将在哪里寻找模块。
Python在哪里寻找进口?
>>> import sys>>> sys.path['', 'C:\\Users\\user\\Anaconda3\\python37.zip', 'C:\\Users\\user\\Anaconda3\\DLLs', 'C:\\Users\\user\\Anaconda3\\lib', 'C:\\Users\\user\\Anaconda3', 'C:\\Users\\user\\AppData\\Roaming\\Python\\Python37\\site-packages', 'C:\\Users\\user\\Anaconda3\\lib\\site-packages', 'C:\\Users\\user\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Users\\user\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Users\\user\\Anaconda3\\lib\\site-packages\\Pythonwin']
因此,当我们导入模块时,python会查看sys.path
列表。如果在这些路径之一中未找到该模块,则它将引发一个ModuleNotFoundError
。
有多种方法可以确保在运行Python时目录始终位于Python sys.path列表中,包括:
sys.path.append('module/package directory')
导入前使用。概括地说,这就是Python导入模块的方式:
sys.modules
。它检查sys.modules
缓存以查看模块是否已经导入-如果是,则仅在其中使用引用,否则:sys.modules
,名称为键,新创建的对象引用为值。注意:导入模块时,将执行模块代码。
导入模块时会发生什么
导入模块名
sys.modules
使用module_name的键添加对它的引用从module_name导入somename
sys.modules
使用module_name的键添加对它的引用导入module_name作为randomename
sys.modules
使用module_name的键添加对它的引用从module_name导入somename作为randomname
sys.modules
使用module_name的键添加对它的引用从module_name导入*
sys.modules
使用module_name的键添加对它的引用__all__
)在这里还是要推荐下我自己建的Python学习群:553215015,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!
转载地址:http://ayhxf.baihongyu.com/