三分钟从入门到精通Python模块(我们在名为utils的模块中定义了一个名为乘法的函数)
(我们在名为utils的模块中定义了一个名为乘法的函数)
https://m.toutiao.com/is/JE2UqX5/
什么是python中的模块:
假设您正在使用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 '<stdin>', line 1, in <module>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如何导入模块:
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')导入前使用。
- 将目录放入PYTHONPATH环境变量的内容中。
- 使模块可安装并安装。
概括地说,这就是Python导入模块的方式:
- 导入搜索期间检查的第一个地方是sys.modules。它检查sys.modules缓存以查看模块是否已经导入-如果是,则仅在其中使用引用,否则:
- 它创建一个新的模块对象(types.ModuleType)
- 它从文件加载源代码
- 它将添加一个条目sys.modules,名称为键,新创建的对象引用为值。
- 它编译并执行源代码。
注意:导入模块时,将执行模块代码。
导入模块时会发生什么
- 导入模块名如果整个模块(模块名)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用在我们当前的名称空间中添加一个引用了module_name对象的相同名称的符号
- 从module_name导入somename如果整个模块(module_name)还不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号somename添加到引用module_name.somename函数的当前名称空间中它不会将符号module_name添加到我们当前的名称空间中
- 导入module_name作为randomename如果整个模块(module_name)还不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号randomename添加到引用module_name对象的当前名称空间中
- 从module_name导入somename作为randomname如果整个模块(module_name)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号randomname添加到引用module_name.somename函数的当前名称空间中它不会将符号module_name添加到我们当前的名称空间中
- 从module_name导入*如果整个模块(module_name)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将module_name模块中所有导出符号的符号直接添加到我们的名称空间(我们可以使用来控制导入的内容__all__)它不会将符号module_name添加到我们当前的名称空间中
最后多说一句,小编是一名python开发工程师,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以关注小编,并私信“01”领取。