分享

三分钟从入门到精通Python模块(我们在名为utils的模块中定义了一个名为乘法的函数)

 山峰云绕 2021-02-15

   (我们在名为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提供了两种导入模块的方法,如下所示:

  1. import module_name
  2. 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列表中,包括:

  1. sys.path.append('module/package directory')导入前使用。
  2. 将目录放入PYTHONPATH环境变量的内容中。
  3. 使模块可安装并安装。

概括地说,这就是Python导入模块的方式

  1. 导入搜索期间检查的第一个地方是sys.modules。它检查sys.modules缓存以查看模块是否已经导入-如果是,则仅在其中使用引用,否则:
  2. 它创建一个新的模块对象(types.ModuleType)
  3. 它从文件加载源代码
  4. 它将添加一个条目sys.modules,名称为键,新创建的对象引用为值。
  5. 它编译并执行源代码。

注意:导入模块时,将执行模块代码。

导入模块时会发生什么

  1. 导入模块名如果整个模块(模块名)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用在我们当前的名称空间中添加一个引用了module_name对象的相同名称的符号
  2. 从module_name导入somename如果整个模块(module_name)还不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号somename添加到引用module_name.somename函数的当前名称空间中它不会将符号module_name添加到我们当前的名称空间中
  3. 导入module_name作为randomename如果整个模块(module_name)还不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号randomename添加到引用module_name对象的当前名称空间中
  4. 从module_name导入somename作为randomname如果整个模块(module_name)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将符号randomname添加到引用module_name.somename函数的当前名称空间中它不会将符号module_name添加到我们当前的名称空间中
  5. 从module_name导入*如果整个模块(module_name)尚不存在,则将其加载到内存中sys.modules使用module_name的键添加对它的引用将module_name模块中所有导出符号的符号直接添加到我们的名称空间(我们可以使用来控制导入的内容__all__)它不会将符号module_name添加到我们当前的名称空间中

最后多说一句,小编是一名python开发工程师,这里有我自己整理的整套python学习资料和路线,想要这些资料的都可以关注小编,并私信“01”领取。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多