Python基础篇(十一)-- 模块和包

        Python提供了强大的模块支持,主要体现为不仅在Python标准库中包含了大量的模块(称为标准模块),而且还有很多第三方模块,另外开发者自己也可以开发自定义模块。通过这些强大的模块支持将极大地提高我们的开发效率。

        模块到底指的是什么呢?模块,英文为 Modules,至于模块到底是什么,可以用一句话总结:模块就是 Python 程序。换句话说,任何 Python 程序都可以作为模块,包括在前面章节中写的所有 Python 程序,都可以作为模块。

        我们知道Python代码可以写到一个文件中,但随着程序功能的复杂,程序体积会不断变大,为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。

        代码的可重用性体现在,当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。

1 自定义模块

        在Python中,自定义模块有两个作用:一个是规范代码,让代码更易于阅读,另一个是方便其他程序使用己经编写好的代码,提高开发效率。

        实现自定义模块主要分为两部分,一部分是创建模块,另一部分是导入模块。

1.1 创建模块

        创建模块时,可以将模块中相关的代码(变量定义和函数定义等)编写在一个单独的文件中,并且将该文件命名为“模块名+.py”的形式。代码如下所示:

def foo():
    '''module1.py'''
    print("hello, world!')
```python
def foo():
    '''module2.py'''
    print("goodbye, world!')

        温馨提示: 创建模块时,设置的模块名不能是Python自带的标准模块名称。

1.2 使用import语句导入模块

        创建模块后,就可以在其他程序中使用该模块了。要使用模块需要先以模块的形式加载模块中的代码,这可以使用import语句实现。创建一个test.py函数进行测试:

from module1 import foo

# 输出hello, world!
foo()

from module2 import foo

# 输出goodbye, world!
foo()

        如果模块名比较长不容易记住,可以在导入模块时,使用as关键字为其设置一个别名,然后就可以通过这个别名来调用模块中的变量、函数和类等。例如,将上面导入模块的代码修改为以下内容:

import module1 as m1
import module2 as m2

m1.foo()
m2.foo()

        说明: 在调用模块中的变量、函数或者类时,需要在变量名、函数名或者类名前添加“模块名.”作为前缀。

        一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

        当我们使用 import 语句的时候,Python 解释器是怎样找到对应的文件的呢?
(1) 在当前目录(即执行的 Python脚本文件所在目录)下查找。
(2)到PYTHONPATH(环境变量)下的每个目录中查找。
(3)到Python的默认安装目录下查找。

        以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。了解更多请阅读:http://c.biancheng.net/view/4645.html

        解决“Python找不到指定模块”的方法有 3 种,分别是:
        (1)向sys.path中临时添加模块文件存储位置的完整路径;
        (2)将模块放在sys.path变量中已包含的模块加载路径中;
        (3)设置path系统环境变量。

        在使用import语句导入模块时,每执行一条import语句都会创建一个新的命名空间(namespace),并且在该命名空间中执行与.py文件相关的所有语句。在执行时,需在具体的变量、函数和类名前加上“模块名.”前缀。如果不想在每次导入模块时都创建一个新的命名空间,而是将具体的定义导入到当前的命名空间中,这时可以使用from…import语句。使用from…import语句导入模块后,不需要再添加前缀,直接通过具体的变量、函数和类名等访问即可。

        说明: 命名空间可以理解为记录对象名字和对象之间对应关系的空间。目前Python的命名空间大部分都是通过字典(dict)来实现的。其中,key是标识符; value是具体的对象,例如,key是变量的名字, value则是变量的值。

        注意: 在使用from...import语句导入模块中的定义时,需要保证所导入的内容在当前的命名空间中是唯一的,否则将出现冲突,后导入的同名变量、函数或者类会覆盖先导入的。这时就需要使用import语句进行导入。


2 Python中的包

        使用模块可以避免函数名和变量名重名引发的冲突。那么,如果模块名重复应该怎么办呢?在Python中,提出了包(Package)的概念。包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下。这样,既可以起到规范代码的作用,又能避免模块名重名引起的冲突。

        说明:包简单理解就是“文件夹”,只不过在该文件夹下必须存在一个名称为“__init__.py”的文件,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。这是Python 2.x的规定,而在Python 3.x中,__init__.py对包来说,并不是必须的。

2.1 Python 程序的包结构

        在实际项目开发时,通常情况下,会创建多个包用于存放不同类的文件。例如,开发一个网站时,可以创建如下图所示的包结构。

一个Python项目的包结构

2.2 创建和使用包

1. 创建包

        创建包实际上就是创建一个文件夹,并且在该文件夹中创建一个名称为“__init__.py”的Python文件。在__init__.py文件中,可以不编写任何代码,也可以编写一些Python 代码。在__init__.py文件中所编写的代码,在导入包时会自动执行。

        说明:__init__.py文件是一个模块文件,模块名为对应的包名。例如,在settings包中创建的__init__.py文件,对应的模块名为settings。

        例如,在E盘根目录下,创建一个名称为settings的包,可以按照以下步骤进行:
        (1)计算机的E盘根目录下,创建一个名称为settings的文件夹。
        (2)在IDLE中,创建一个名称为“__init__.py”的文件,保存在E:\settings文件夹下,并且在该文件中不写任何内容,然后再返回到资源管理器中,效果如下图所示。

创建__init__.py文件后的效果

        至此,名称为settings的包创建完毕了,创建完毕之后便可以在该包中创建所需的模块了。

2. 使用包
        创建包以后,就可以在包中创建相应的模块,然后再使用import语句从包中加载模块。从包中加载模块通常有以下3种方式:

  • 通过“import+完整包名+模块名”形式加载指定模块
  • 通过“from+完整包名+import+模块名”形式加载指定模块
  • 通过“from+完整包名+模块名+ import+定义名”形式加载指定模块

3 引用其他模块

        在Python中,除了可以自定义模块外,还可以引用其他模块,主要包括使用标准模块和第三方模块。下面分别进行介绍。

3.1 导入和使用标准模块

        在 Python中,自带了很多实用的模块,称为标准模块(也可以称为标准库),对于标准模块,我们可以直接使用import语句导入到Python文件中使用。例如,导入标准模块random(用于生成随机数),可以使用下面的代码:

import random   # 导入标准模块random

        温馨提示: 在导入标准模块时,也可以使用as关键字为其指定别名。通常情况下,如果模块名比较长,则可以为其设置别名。

        除了random模块外,Python还提供了大约200多个内置的标准模块,涵盖了Python运行时服务、文字模式匹配、操作系统接口、数学运算、对象永久保存、网络和Internet脚本和GUI构建等方面。


Python常用的内置标准模块

3.2 第三方模块的下载与安装

        在使用第三方模块时,需要先下载并安装该模块,然后就可以像使用标准模块一样导入并使用了。本节主要介绍如何下载和安装。下载和安装第三方模块可以使用Python提供的 pip命令实现。pip命令的语法格式如下:

pip <command> [modulename]

        参数说明:

  • command:用于指定要执行的命令。常用的参数值有install(用于安装第三方模块)、uninstall(用于卸载已经安装的第三方模块)、list(用于显示已经安装的第三方模块)等。
  • modulename:可选参数,用于指定要安装或者卸载的模块名,当command为 install 或者uninstall时不能省略。

        说明:在大型程序中可能需要导入很多模块,推荐先导入Python提供的标准模块,然后再导入第三方模块,最后导入自定义模块。

        如果想要查看Python中都有哪些模块(包括标准模块和第三方模块),可以在IDLE中输入以下命今:

help('modules)

        如果只是想要查看已经安装的第三方模块,可以在命令行窗口中输入以下命令:

pip list
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路漫漫2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值