博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三分钟从入门到精通---Python模块
阅读量:2021 次
发布时间:2019-04-28

本文共 4037 字,大约阅读时间需要 13 分钟。

什么是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 "
", 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如何导入模块:

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学习群:553215015,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2020最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

转载地址:http://ayhxf.baihongyu.com/

你可能感兴趣的文章
JavaScript 清除图片背景颜色 使之透明
查看>>
拆分备份(还原)比较大的数据库为多个bak文件
查看>>
C# 看老程序员如何精减代码
查看>>
vuejs 和 element 搭建的一个后台管理界面【收藏】
查看>>
利用Android 8.0 ShortcutManager创建桌面快捷图标
查看>>
最新!2019 年中国程序员薪资生存调查报告出炉
查看>>
漫画:什么是架构师?
查看>>
js中null,undefined,false,0,'',[],{}判断方法
查看>>
Android 节操视频播放器jiecaovideoplayer自定义播放音频使用:屏蔽全屏按钮,增加倒计时,当前时间/总时间
查看>>
data类型的Url的格式
查看>>
浅谈CAS在分布式ID生成方案上的应用
查看>>
单KEY业务,数据库水平切分架构实践
查看>>
库存扣多了,到底怎么整
查看>>
SQL调优
查看>>
网页标签介绍,行级、块级元素,选择器的知识点, HTML的6种空格
查看>>
异常:Index 0 out-of-bounds for length 0
查看>>
异常:(HTTP Status 500)Request processing failed; nested exception is java.lang.NullPointerException
查看>>
Win 10的Java JDK9环境变量配置
查看>>
win 10配置Tomcat 8.5环境变量
查看>>
Navicat MySQL建表设置时间戳,createtime字段自动添加为当前时间
查看>>