一、模块

1. 什么是模块?

模块,简单来说就是Python文件啦!就像把一张纸写上你喜欢的代码,然后保存成.py格式,就成了一个模块啦!

  • 就是一段.py代码。

  • 还可以是用C或C++写的,编译成共享库或DLL的扩展。

  • 有时候,一组模块打包在一起,形成了一个包。

  • 还有一些内置的模块,是用C写的,然后链接到Python解释器中的。

2. 为什么要使用模块?

嗯哼,听着,如果你把你的代码写在Python解释器里,然后关了再打开,嘿,都没了!所以,我们把代码写到文件里,就像写信一样,这样就能永久保存啦!然后,我们可以通过 python 文件名.py 这样的方式来执行我们的程序,这种文件就叫脚本。

但是,慢慢地,你的程序变得越来越庞大,就像变胖一样,哈哈!为了方便管理,我们把程序分成一块块小模块,这样就像拼积木一样,结构清晰,好管理。这时候,我们不仅仅可以把这些文件当脚本执行,还能把它们当成模块,导入到其他模块中,这样,代码就可以被反复利用啦!

3. 模块的概念

模块就像是 Python 程序的组成积木,这个积木的核心概念哦!

  • 每个以 .py 结尾的 Python 源代码文件都是一个模块,就像每个箱子都装着宝贝一样!

  • 模块名也是一个标识符,得符合标识符的规定,别搞错了哦!

  • 在模块里定义的全局变量函数就像是装在箱子里的工具,拿来就能用!

  • 想要用这个工具箱里的工具?先得导入这个模块,就像你要打开箱子一样!

4. 模块的两种导入方式

1)import 导入

import 模块名1
import 模块名2 

哟,导入模块啦!每个模块独占一行,这是规矩,不要挤来挤去。导入完毕后,就可以用模块名来调用里面的工具了,就像是工具箱里的各种工具,随时拿来用。如果模块名太长,你可以给它起个小名,用 as 关键字,符合大驼峰命名法,高大上。

import 模块名1 as 模块别名

2)from…import 导入

要是只想从某个模块中拿几样东西,就用 from…import 的方式。记住,这种方式只能拿部分工具,不像 import 模块名 是一锅端,全拿来。嗯,from 后面接模块名,再跟着 import 要拿的工具名,一目了然,清清楚楚。

from 模块名1 import 工具名

导入后就可以直接用,不需要再加模块名前缀,简单明了。不过,要小心了,如果两个模块有同名的函数,后面导入的会盖掉前面的哦!写代码要有点仪式感,import 最好写在顶部,不容易错过。冲突了怎么办?给其中一个工具起个别名,妥妥的。

from 模块名1 import *

别看这样方便,其实这招不太走运,函数重名问题不好排查,所以不推荐使用。

5. 模块的搜索顺序[扩展]

当你在Python中 导入模块 时,解释器会按照以下步骤进行:

  1. 首先,它会在 当前目录 下查找指定的模块文件,如果找到就直接导入它。

  2. 如果当前目录下没有找到对应的文件,解释器会继续在 系统目录 中搜索。

在编写代码时,记得给文件起个不会与 系统模块文件 冲突的名字哦!

每个Python模块都有一个特殊的属性 __file__,可以帮你查看模块的完整路径。

举个例子:

import random

# 生成一个 0 到 10 的随机数字
rand = random.randint(0, 10)

print(rand)

请注意:如果当前目录下存在一个名为 random.py 的文件,那么这段程序将无法正常执行!

这时,Python解释器会加载当前目录下的 random.py 而不是系统的 random 模块。

6. 原则 —— 每个文件都应该可导入

  • 一个 独立的 Python 文件 就是一个 模块

  • 在导入文件时,文件中所有 没有缩进的代码 都会被执行一次!

实际开发场景

  • 在实际开发中,每个模块都是由不同的人独立开发的。

  • 开发人员 通常会在 模块底部 添加一些测试代码。

    • 这些代码仅在模块内部使用,被其他文件导入时无需执行。

__name__ 属性:

  • __name__ 属性可以让测试代码 仅在测试时运行,在被 导入时不执行

  • __name__ 是Python的一个内置属性,保存着一个 字符串

  • 如果是被其他文件导入的,__name__ 就是模块名。

  • 如果是当前执行的程序,__name__ 就是 __main__

在许多Python文件中,你会看到以下格式的代码:

# 导入模块
# 定义全局变量
# 定义类
# 定义函数

# 在代码的最底部
def main():
    # ...
    pass

# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
    main()

二、包(Package)

1. 包的概念

包是一种神奇的东西,就像是把一群小伙伴放在同一个大箱子里,然后给这个箱子起个特别的名字,叫做__init__.py。这样一来,这个箱子就变成了一个包。

  • 是一个 大箱子,里面装着 很多小伙伴(模块)

  • 这个 大箱子 里有一个 神秘的文件 叫做 __init__.py

  • 包的名字和变量名一样,都是 小写字母 + _

好处:使用 import 包名 就像是一下子把 大箱子 里的 所有小伙伴 都叫了出来。

2. 包与模块的区别

包是更大一点的箱子,操作起来也简单些:

  1. 创建一个文件夹,给它起个名字,这个名字就是包的名字。

  2. 在文件夹里创建一个特别的模块文件,叫做 __init__.py,可以什么都不写。

  3. 把相关的小伙伴(模块)放进去。

Python中的包,就是多个小伙伴(模块)一起玩耍的文件夹。

为什么要有包?因为如果一个项目里有很多个小伙伴(模块),那么就会有两个问题:模块太多了,找起来不方便;大项目里不同小伙伴(模块)的名字有可能会撞车。

3. 制作包

  • 1.创建一个叫做 hm_message 的大箱子

  • 2.在箱子里面,放两个小伙伴,一个叫做 send_message,一个叫做 receive_message

  • 3.在 send_message 小伙伴里写一个叫做 send 的函数

  • 4.在 receive_message 小伙伴里写一个叫做 receive 的函数

  • 5.在外面直接导入 hm_message 这个大箱子

__init__.py

  • 要想在外面使用 大箱子 里的小伙伴,得在 init.py 里写下 给外面的小伙伴看的列表

    # 从 当前目录 导入 小伙伴列表
    from . import send_message
    from . import receive_message

4. 导入包

(1) 导入包里的小伙伴

import 包名,模块名称

(2)用from···· imoprt 形式

from 包名称 import 模块名称

(3)用from ····import*形式

from 包名称 import*

(4)导入包里的小伙伴的特定技能或者东西

from 包的名称,模块的名称 import 方法名称

总结:包和模块的导入很像,就好比是找朋友一样,记住了吗?

三、发布模块(了解)

如果你想要和别人一起搞基,分享你自己开发的模块,按照以下步骤来操作吧!

3.1 制作发布压缩包步骤

1) 创建 setup.py

  • 在文件系统中建立一个叫做 setup.py 的文件,内容如下:

from distutils.core import setup

setup(name="hm_message",  # 包名
      version="1.0",  # 版本
      description="itheima's 发送和接收消息模块",  # 描述信息
      long_description="完整的发送和接收消息模块",  # 完整描述信息
      author="itheima",  # 作者
      author_email="itheima@itheima.com",  # 作者邮箱
      url="www.itheima.com",  # 主页
      py_modules=["hm_message.send_message",
                  "hm_message.receive_message"])

想了解更多关于这些参数的信息?看看这个官方网站:https://docs.python.org/2/distutils/apiref.html

2) 构建模块

$ python3 setup.py build

3) 生成发布压缩包

$ python3 setup.py sdist

注意:要制作哪个版本的模块,就使用哪个版本的解释器执行!

3.2 安装模块

$ tar -zxvf hm_message-1.0.tar.gz 

$ sudo python3 setup.py install

卸载模块:直接从安装目录下,把安装模块的 目录 删除就可以

$ cd /usr/local/lib/python3.5/dist-packages/
$ sudo rm -r hm_message*

3.3 pip 安装第三方模块

  • 想用上第三者的东西?用pip就对了!

    • 第三方模块就是那些被 其他人 开发的,然后被 众多程序员 广泛使用的 Python 包 / 模块

  • pip 是个现代的,通用的 Python 包管理工具

  • 它负责查找、下载、安装、卸载等等,完全就是个包治百病的好医生!

安装和卸载命令就是这样的

# 要装到 Python 2.x 环境
$ sudo pip install pygame
$ sudo pip uninstall pygame

# 要装到 Python 3.x 环境
$ sudo pip3 install pygame
$ sudo pip3 uninstall pygame

Mac 上想装个 iPython?

$ sudo pip install ipython

Linux 下也想来个 iPython?

$ sudo apt install ipython
$ sudo apt install ipython3