Python学习之包与模块详解

目录
  • 什么是 Python 的包与模块
    • 包的身份证
    • 如何创建包
    • 创建包的小练习
  • 包的导入 - import
  • 模块的导入 - from…import
    • 导入子包及子包函数的调用
    • 导入主包及主包的函数调用
    • 导入的包与子包模块之间过长如何优化
  • 强大的第三方包
    • 什么是第三方包
    • 如何安装第三方包
  • 总结

大家好,学完面向对象与异常处理机制之后,接下里我们要学习 包与模块 。首先我们要了解什么是包?什么是模块?接下来我们还要学习 如何自定义创建包、自定义创建模块以及如何导入包与模块。最后我们在学习如何使用第三方包,第三方包就是别人开发好的包。关于包的课程学完之后,就是文件的读写,通过学习这方面的知识,可以让我们动态的创建文件、编辑文件、阅读文件。当我们具备文件的基础读写能力之后,我们就可以学习一些相关的模块了,如 yaml文件模块、json文件与模块、日志模块....

接下来我们就开始学习 包与模块 ,通过学习该部分之后,我们就可以灵活运用 Python 在各个领域中了。比如 web 开发,我们就可以使用 web 相关的包与模块。有很多人在为 python 做贡献,他们贡献的就是这些 包与模块。而之前我们学习的课程,也都是在为我们学习包与模块在做准备,一句话总结,学会 包与模块 是真正学会 Python 的重要标志。

什么是 Python 的包与模块

  • 包的定义:简单粗暴的解释,当一个文件夹内包含一个 __init__.py 文件时我们就可以认为它是一个包;如果该文件夹下还有子文件夹且该子文件夹中也有一个 __init__.py 文件,我们就可以认为它是包中还有包。
  • 模块的定义:任何 *.py 格式的文件都可以当作模块,我们可以使用 import 关键字对其执行导入操作。

我们都知道每一个模块下都是 Python 的函数,所以我们使用一个包或者模块,最终的目的就是使用他们内部函数的功能帮助我们实现业务需要。

一个包里,可以有一个或多个模块;通过调用 包 下面某个 模块 的某个函数去执行,这就是我们使用 Python包或模块的目的

包的身份证

__init__.py 文件时每一个 python 包必须存在的文件,只有存在 __init__.py 文件的目录,python 解释器才会认为这是一个 包 ;如果没有该文件, python 解释器只会认为这是一个普通的文件夹。示意图如下:

从上图我们看出来,除了 __init__.py 文件之外,包的目录文件图标有个圆形的小圆点式的图案。而普通文件夹没有任何标识。试想一下,如果我们在 python_package_test 文件夹内创建一个 __init__.py 文件会怎样?44944…

如何创建包

其实已经不再需要多说什么了,首先创建一个文件夹。然后在文件夹中创建一个 python 包的身份证文件 __init__.py 即可;__init__.py 文件可以空空如也,什么都不用写,只要保证该文件的名字是 __init__.py 即可。 Python 解释就会认为这是一个包,之后我们就可以在包里书写任意的脚本(也就是模块),非常的简单。不过我们还需要创建包的良好规范:

  • 首先要有一个主题,功能明确,同时也要方便使用;方便别人看一眼名字就知道是否需要使用你这个包。
  • 其次层次要分明,一个包内可以有很多各模块或者子包。它们之间的关系要明确,这也为后期维护代码起到很好的辅助作用。

除了上述的创建文件夹之后再创建包的身份文件 __init__.py 之外,Pycharm 还可以直接通过 new ---> Python Package 的方式,直接创建一个包。示意图如下:

创建包的小练习

接下来我们尝试创建一个 animal 的包,同时在 animal 包下创建一个 cat 包 和 dog 包。然后分别在 cat 包与 dog 包中创建一个 action.py 模块,并且在各自的 action.py 模块定义 eat()、jump()、run() 函数。

同样的方法在 dog 子包内创建 action.py 模块,内容如下:

# coding:utf-8

def eat():
    return '狗爱啃骨头'

def run():
    return '猫会跑'

def jump():
    return '猫会跳'

这里我们创建了 cat 与 dog 两个子包,实际上真正有功能的是两个子包中的 action.py 模块。在这两个模块内,各有三个函数 eat()、run()、jump()。所以我们的最终目的是使用分别来自 cat 与 dog 两个子包的 action.py 模块的三个函数,接下来我们就看一下如果导入、调用这两个子包与使用子包内的函数。

包的导入 - import

如果想要使用一个 包 或者 模块 ,就需要先将其导入到我们当前的脚本中。在学习 python 脚本结构 的章节,我们曾经介绍过,在脚本的顶部为 头部注释 区域;接下来就是 导入区域 ,导入区域 就是将我们需要的包、模块导入到我们当前的脚本中。接下来 我们看一下 包的导入 import 关键字的用法:

# 用法:
import package

# 参数:
# package:被导入的包的名字

# 要求:
# 只有 python 包才能被 impor 关键字捕获并导入,也就是说 python 包中必须要有 __init__.py 这个文件
# 并且 import 只会拿到当前对应包下的 __init__.py 中的功能或当前模块下的功能

关于 import 只会拿到当前对应包下的 __init__.py 中的功能或当前模块下的功能 可能不是那么好理解,接下来 我们在 Pycharm 做个小实验,加深一下理解。

首先打开 Terminal 终端,输入 python 启动 Python 解释器。然后导入 animal 包,然后使用 animal 包下的 cat子包。如下图:

这里发现报错了,属性错误 animal 里没有 cat 这个属性;这是为什么?cat 这个子包 确实在我们的 animal 包下啊。再做个小实验,我们在 animal 包下的 __init__.py 文件内书写一些内容。

然后退出我们的 python 解释器再进入,为什么要退出呢?这是因为我们的包的当前结构发生了变化,所以需要退出再重新进入,否则 在 Treminal 终端执行的仍然是之前的结果。这个时候我们再重新 import animal 的包,然后执行以下看看。

这时候在结合刚刚我们说的 import 只会拿到当前对应包下的 __init__.py 中的功能或当前模块下的功能 , 如果想要调用一个包中或者模块中的函数函数功能,只需要通过包或者模块的名称 + . 的形式去调用它的函数名就可以了。这个方法是不是和我们面向对象的使用方式很相似呢?

现在又有一个问问题了,刚刚我们导入的是 animal 包以及使用了 __init__.py 文件中的功能,那么我们我们该如何使用 animal 包下的 cat / dog 子包中的函数功能呢? 继续往下,我们看看 模块的导入 部分

模块的导入 - from…import

接下来我们学习如何通过包导入对应的模块,这一次我们需要 fromimport 两个关键字来配合了;当这两个关键字配合起来之后,就可以通过某个包找到对应的模块。接下来 我们看一下 from...import... 的用法

# 用法:
from package import module

# 参数:
# package:要导入的包名
# module:包中的目标模块

# from package import module 的意思就是 从当前的包中导入某个模块

# 示例如下:

from animal import dog
dog.run()

# 通过 from ... import ... 直接找到了 dog 模块
# 所以只需要使用 dog 模块 直接用 . 的方式找到里面的 run 方法就可以执行了

接下来我们尝试 参照上文的 animal 包 导入 dog 的子包 调用里面的 run 函数,内容如下:

导入子包及子包函数的调用

这里我们发现了一个问题,两个子包下面都有 action 模块,当我们分别 导入调用的时候会被覆盖,有没有什么办法让我们同时导入两个子包的 action 模块,分别可以调用但是互不影响呢?这就需要借助到我们的as 关键字 了。 在我们学习异常的时候,利用 as 关键字 关键字将捕获的异常进行一个起别名的操作,在这里我们依然可以对我们导入的模块起别名。如下图

现在我们是直接通过导入模块来调用 action 模块下的函数,那可不可以直接调用函数来使用的呢?尝试一下:

导入主包及主包的函数调用

首先我们在主包 animal 的子包同级路径下创建一个 main.py 文件,并定义一个 main 函数,然后再进行调用。内容如下:

# coding:utf-8

def animal():
    return '这是一个 animal 包下子包同级路径下的模块的函数'

然后我们调用该 main.py 文件的 animal 函数

导入的包与子包模块之间过长如何优化

我们来看一下 导入 animal 包下 cat 子包 的 action 模块的 eat() 函数的导入

前文我们提到过 import 只会拿到当前对应包下的 __init__.py 中的功能或当前模块下的功能 ,那么我们是否可以把 cat 与 dog 子包中的函数导入到 animal 包下的 __init__.py ?

接下来 我们尝试一下 在 animal 包 同级别下创建一个 animal_test.py 文件,然后在 animal_test.py 文件内导入 子包获取其函数。

注意:这里的 animal_test.py 脚本 需要与 animal 包处于同一级别的文件加下,才可以导入我们定义好的 __init__.py 文件的函数功能;如果不在同一个文件的级别下,导入是不成功的,大家可以自己手动试一下。

强大的第三方包

上面我们学习了什么是 python 的包,以及如何创建一个包,并通过导入的方法使用我们的包与模块。在上面对包的使用相当于是我们自己开发自己使用,属于一种自产自销的模式。而接下来我们要学习使用他人开发好的第三方包来帮助我们高效的工作,学完这一小章节我们就可以从浩瀚的第三方包选择我们需要的包来帮助我们自己完成我们想要的功能。

比如爬虫的包可以帮助我们爬取图片、文章等各种我们想要的数据;绘图的包可以帮我们对各种图片进行处理…

什么是第三方包

其实第三方包就是其他程序员公开到 Python 指定网站上写好的功能封装成包或者模块,方便其他程序员方便下载和使用。

使用第三方包最大的好处就是我们想要实现的功能可能别人已经帮助我们写好了,我们只需要拿来主义,直接应用在我们自己的代码中就可以了,这样自然就大大的提高了我们的开发效率

如何安装第三方包

了解了第三方包之后,我们需要去下载并安装他们才可以在我们的代码中使用。而 pip 与 easy_install就是获取第三方包的工具,在我们安装好python 的时候,pip 就已经自动安装好了,我们只需要在 Terminal 终端 去使用即可;

随着 python 的发展越来越快,pip 的使用率也越来越高,就逐渐的替代了 easy_install 。

我们刚刚说的 在我们安装好 python 的时候,就自动的安装了 pip 其实是有版本限制的,在 Python 3.4 版本之前是不会安装 pip 的; Python 3.4 版本之后,会自带这两种包管理工具。

如果使用的是 老版本的 python ,可以通过 https://pip.pypa.io/en/stable/installing/ 去下载安装 pip

由于 pip 管理工具中的第三方包要比 easy_install 多很多,所以我们主要介绍 pip 的使用。pip 的用法也是非常简单的,我们只需要在 Terminal 终端,输入 pip install 包名 就可以进行下载并安装。

这里也推荐大家一个 python 程序员的宝藏网站,github.com 搜索 python 第三方包 (github 会伴随程序员的完整职业生涯);在 github 有很多程序员公开出来的第三方包,自然也有 python 的。需要注意的是 github 是一个国外的网站,所以访问的有点慢,大家可以 kexueshangwang 。或者也可以临时使用 国内的镜像源地址 ,在下方的 pip 安装拓展 小节有介绍。

pip 安装 第三包

# 查询当前 pip 版本:
pip -V

# 执行结果如下:
# pip 21.1.2 from D:\PycharmProjects\XXXXX\XXXXX\venv\lib\site-packages\pip (python 3.10)

PS:每一个版本的 python 都有自己的 pip ,所以当我们安装了多个版本的 python 后,犹豫 python 版本太多,所以如果我们使用错了 pip ,就会造成我们有的时候看着像是已经安装好了第三方包,但却无法使用的情况。所以这个地方是一定要注意的!!!

安装第一个第三方包工具 - ipython

接下来我们就尝试一下安装我们第一个第三方包 - ipython;

ipython 是一个 python 的交互式 shell ,比默认的 python shell 好用很多,支持变量自动补全,自动缩进。

在 Terminal 终端,输入 pip install ipython ,如果报错:WARNING: You are using pip version 21.1.2; however, version 22.0.4 is available. 可以通过 kexueshangwang 的方式安装、或 临时使用国内镜像源地址、再或者 升级 你的 pip ;升级 命令 python -m pip install --upgrade pip

这里看到,我们安装失败了;利用我们上面说的方法 kexueshangwang 的方式们再次安装

当看到 Successfully 则表示我们已经安装成功了,虽然仍提示 WARNING 让我们升级 pip ,但是我们依然安装成功。试试看 ipython 是否可以正常使用。

通过与 python 自带的 shell 终端相比, ipython 不仅交互更方便,还可以自动支持变量自动补全,自动缩进。凸显了极大的人性化的便捷性。

这里还有个需要注意的地方,当我们的环境安装了 多个版本的 python 时,一定要检查我们安装的路径对不对,否则就会出现安装到其他版本 python 的 情况。如下图:

当然了如果默认是进入我们其他版本的 python 或者 ipython 我们可以通过 python3 或者 ipython3 的命令进入到我想要进去的版本的交互终端。

注意:在我们平时执行一个脚本的时候,我们还是推荐使用 python 解释器,ipython 只是作为我们的一个调试环境使用。

pip 安装拓展

实际上我们安装 pip 和 第三方包 是有选择的,默认情况下选择的是国外的地址去下载并安装,由于网络与距离的原因往往会很慢,同时因为网络波动问题会造成我们安装失败的情况。

在这种情况下,我们国内就推出了一写可以就近进行下载和安装的地址,比如我们的 清华、阿里云、中国科技大学、华中理工大学等都提供了近源地址。如下:

# 官方源地址
# https://pypi.python.org/simple/
# https://pypi.tuna.tsinghua.edu.cn/simple/

# 国内源地址
# 阿里云:http://mirrors.aliyun.com/pypi/simple/
# 中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple/
# 豆瓣:http://pypi.douban.com/simple/
# 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/
# 中国科学技术大学:http://pypi.mirrors.ustc.edu.cn/simple/

# 使用方法如下:

pip install -i http://pypi.douban.com/simple/ ipython
pip install -i http://pypi.douban.com/simple/ ipython==7.12.0   # 指定版本号安装

pip 安装第三方包的卸载

既然可以安装,那就肯定可以卸载。卸载方法如下:

# 卸载方法:

pip uninstall ipython

# 这里同样需要注意,被卸载的第三方包对应的 python 解释器版本的问题。

总结

今天该章节主要介绍了什么是包,什么是模块。如何导入包、模块,导入子包、主包如何调用他们的函数。最后又讲述了如何安装、使用、卸载第三方包。

以上就是Python学习之包与模块详解的详细内容,更多关于Python包 模块的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python模块、包(Package)概念与用法分析

    本文实例讲述了Python模块.包(Package)概念与用法.分享给大家供大家参考,具体如下: Python中"模块"的概念 在开发中,我们会有很多函数,我们可以把这些函数都放到一个文件. 比如function.py中: #定义函数 def show(): print("jack") #定义变量 name = "tom" 在其他地方要使用其中的函数怎么办呢? 第一步:需要先引入 import funtions 第二步:通过文件名.函数名/变量名

  • Python入门之模块与包

    模块指的是Python的程序文件(源文件),模块的文件名就是模块名加上.py,里面包含了Python对象定义和Python语句,模块包含了定义函数.类和执行代码等等.模块提高了代码的可维护性.模块提高了代码的可重用性.模块避免了函数名和变量名冲突. 在Python中,模块可以分为3类,内置标准模块.自定义模块.第三方模块 一.模块导入 1. import 语句: 想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下: 语法: import module1[, mo

  • Python程序设计入门(4)模块和包

    Python语言功能非常强大,除了类之外,还有模块和包的概念,这有点像perl,此处简单说说包和模块. 一.Python中的模块 模块--其实就是我们说的库(lib)的概念,不过它不仅只是可以包含一系列函数,也可以包含类,python里是没有像C语言之类,直接include某文件的,包正是这种类似的东西. Python 引入模块的方法有两种: 1.import 模块名(实际是对应的就是 文件名.py ) 2.模块名 = __import__("模块文件名(不带扩展名)") 也可以&qu

  • Python中模块(Module)和包(Package)的区别详解

    1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 使用模块有什么好处? 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模

  • Python--模块(Module)和包(Package)详解

    目录 一.模块的导入 1.什么是模块(module) 2.模块有什么作用 3.模块的分类 4.什么是包(package) 5.import/fromimport导入 6.使用名字导入 7.制作包与模块 8.同一个模块重复导入 9.相对导入 10.模块查找顺序 二.Python下划线 1.制作包与模块 2.下划线的特殊含义(模块) 三.文件与模块执行过程 四.模块打包与发布 1.如何分享模块 2.如何使用别人的模块 3.setuptools工具 五.软件目录结构规范 1.定义目录结构目的 2.软件

  • Python中的模块和包概念介绍

    模块概述 如果说模块是按照逻辑来组织 Python 代码的方法, 那么文件便是物理层上组织模块的方法. 因此, **一个文件被看作是一个独立模块, 一个模块也可以被看作是一个文件. 模块的文件名就是模 块的名字加上扩展名 .py . 与其它可以导入类(class)的语言不同,在 Python 中你导入的是模块或模块属性**. 模块名称空间 一个名称空间就是一个名称到对象的关系映射. 导入模块 导入模块整体(import) 方式一 复制代码 代码如下: import module1 import

  • Python学习之包与模块详解

    目录 什么是 Python 的包与模块 包的身份证 如何创建包 创建包的小练习 包的导入 - import 模块的导入 - from…import 导入子包及子包函数的调用 导入主包及主包的函数调用 导入的包与子包模块之间过长如何优化 强大的第三方包 什么是第三方包 如何安装第三方包 总结 大家好,学完面向对象与异常处理机制之后,接下里我们要学习 包与模块 .首先我们要了解什么是包?什么是模块?接下来我们还要学习 如何自定义创建包.自定义创建模块以及如何导入包与模块.最后我们在学习如何使用第三方

  • Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观.它被设计用来传输和存储数据,其焦点是数据的内容.那么Python是如何处理XML语言文件的呢?下面一起来看看Python常用内置模块之xml模块吧. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.在使用ElementTre

  • Python学习之字符串函数使用详解

    目录 1 搜索字符串函数 2 设置字符串格式函数 3 改变字符串大小写函数 4 选定字符串函数 5 拆分字符串函数 6 替换字符串函数 Python的友好在于提供了非常好强大的功能函数模块,对于字符串的使用,同样提供许多简单便捷的字符串函数.Python 字符串自带了很多有用的函数,在字符串函数之前先介绍一个非常实用的dir()内置函数,因为对每一个初学者还是大佬级别的python程序员,都不能完全记住所有方法.而该函数可以查看所有这些函数,可调用 dir 并将参数指定为任何字符串(如 dir(

  • Python学习之模块化程序设计示例详解

    目录 关于模块化程序设计 水果仓库功能简介 主功能实现与程序入口 实现添加功能 实现列出所有信息功能 实现查询信息功能 实现删除信息功能 完整程序如下 关于模块化程序设计 什么是模块化程序设计? 程序设计的模块化指的是在进行程序设计时,把一个大的程序功能划分为若干个小的程序模块.每一个小程序模块实现一个确定的功能,并且在这些小程序模块实现的功能之间建立必要的联系,通过各个小模块之间的互相协作完成整个大功能实现的方法. 模块化设计程序的方法? 一般在针对实现比较复杂程序的情况下,采用的是自上而下的

  • Python自动重新加载模块详解(autoreload module)

    守护进程模式 使用python开发后台服务程序的时候,每次修改代码之后都需要重启服务才能生效比较麻烦. 看了一下Python开源的Web框架(Django.Flask等)都有自己的自动加载模块功能(autoreload.py),都是通过subprocess模式创建子进程,主进程作为守护进程,子进程中一个线程负责检测文件是否发生变化,如果发生变化则退出,主进程检查子进程的退出码(exist code)如果与约定的退出码一致,则重新启动一个子进程继续工作. 自动重新加载模块代码如下: autorel

  • Python多线程编程之threading模块详解

    一.介绍 线程是什么?线程有啥用?线程和进程的区别是什么? 线程是操作系统能够进行运算调度的最小单位.被包含在进程中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. 二.Python如何创建线程 2.1 方法一: 创建Thread对象 步骤: 1.目标函数 2.实例化Thread对象 3.调用start()方法 import threading # 目标函数1 def fun1(num): for i in range(

  • Python学习之直方图均衡化原理详解

    目录 1.点算子 2.线性灰度变换 3.直方图均衡化 4.代码实战 1.点算子 点算子是两个像素灰度值间的映射关系,属于像素的逐点运算,相邻像素不参与运算.点算子是最简单的图像处理手段,如:亮度调整.对比度调整.颜色变换.直方图均衡化等等. 2.线性灰度变换 线性灰度变换表达为: 其中rk.sk分别为输入.输出点像素灰度值. ▲图2.1 线性灰度变换 当a>1时,输出图像像素灰度范围扩大,图像对比度增强,当a<1时反之.这是因为人眼不易区分相近的灰度值,因此若图像灰度值范围较小,观感上细节不够

  • Python学习之文件的读取详解

    目录 文件读取的模式 文件对象的读取方法 使用 read() 函数一次性读取文件全部内容 使用 readlines() 函数 读取文件内容 使用 readline() 函数 逐行读取文件内容 mode().name().closed() 函数演示 文件读取小实战 with open() 函数 利用with open() 函数读取文件的小实战 上一章节 我们学习了如何利用 open() 函数创建一个文件,以及如何在文件内写入内容:今天我们就来了解一下如何将文件中的内容读取出去来的方法. 文件读取的

  • Python学习之元组的使用详解

    目录 元组的创建 元组的删除 元组部分元素的输出 元组的嵌套 元组元素的个数计算:len() 元组中的元素最大最小值的求解:max(),min() 元组中某元素出现的次数:count函数 元组中某元素的索引:index(),返回的为下标值 元组元素值的修改:元组的元素值不能进行修改. 元组的创建 tuple=() #创建一个空元组 print(tuple) print(type(tuple)) 输出: ()<class 'tuple'> 定义只包含一个元素的元组:元素后面必须加逗号,否则编译器

  • Python学习之字符串常用操作详解

    目录 1.查找字符串 2.分割字符串 3.连接字符串 4.替换字符串 5.移除字符串的首尾字符 6.转换字符串的大小写 7.检测字符串(后续还会更新) 1.查找字符串 除了使用index()方法在字符串中查找指定元素,还可以使用find()方法在一个较长的字符串中查找子串.如果找到子串,返回子串所在位置的最左端索引,否则返回-1. 语法格式: str.find(sub[,start[,end]]) 其中,str表示被查找的字符串.sub表示查找的子串.start表示开始索引,缺省时为0.end表

随机推荐