8.1 【基础】什么是包、模块和库?

Python 中除了函数库以外,还有非常多且优秀的第三方库、包、模块。

那么问题就来了,库、模块和包各是什么意思?

它们之间有什么区别呢?今天就一起来学习下。

1. 模块

.py 为后缀的文件,我们称之为 模块,英文名 Module。

模块让你能够有逻辑地组织你的 Python 代码段,把相关的代码分配到一个模块里能让你的代码更好用,更易懂。

假设现在有一个名为 demo.py 的文件,文件内容如下

name="Python编程时光"
print("导入成功")

直接使用 import 语句就可以导入,导入之后,就可以使用 模块名.变量名 的方式访问这个变量。

>>> import demo
导入成功
>>> demo.name
'Python编程时光'
>>>

在导入模块的时候,有一个非常重要的全局变量需要掌握,那就是 __name__ 这个变量。

现在把 demo.py 的内容改成

$ cat demo.py
print("__name__ 的值为: " + __name__)
  • 当模块被直接执行时, __name__ 的值为 __main__

$ python demo.py
__name__ 的值为: __main__
  • 当模块被导入时, __name__ 的值为 模块名

>>> import demo
__name__ 的值为: demo

当该模块被导入后,会在当前目录下产生一个 叫做 __pycache__ 的缓存文件夹。

$ tree
.
├── __pycache__
│   └── demo.cpython-39.pyc
└── demo.py

这个文件夹有什么用呢?

简单来说,当你导入模块的时候,Python解释器会把模块的代码编译成字节码,并放入 __pycache__文件夹中。

这样以后再次运行的话,如果被调用的模块未发生改变,那就直接跳过编译这一步,直接去__pycache__文件夹中去运行相关的 *.pyc 文件,大大缩短了项目运行前的准备时间。

2. 包

在早一点的 Python 版本(Python 3.3 之前)中,如果一个文件夹下有一个 __init__.py 文件,那我们就称之为包,英文名 Package。

在后来的 Python 版本(Python 3.3 开始)中,就没有这个要求了,只要是文件夹就可以当做包,我们称之为空间命名包,为做区分,我把上面那种包称之为 传统包。

考虑到很多人其实并不需要接触到空间命名包,所以我将空间命名包的内容单独放在一节里,为选读章节。

今天这节里主要讲讲传统包的内容。

传统包里的 __init__.py 可以为空文件,但一定要有该文件,它是包的标志性文件,在需要情况下可以在里面进行一些包的初始化工作。

$ tree
.
└── demo
    ├── __init__.py
    ├── bar.py
    └── foo.py

一个包里可以有多个模块,比如上面的 foo.pybar.py 都属于 demo 模块。

如果要使用这些模块,就需要这样导入

>>> import demo.foo
成功导入 foo.py
>>> import demo.bar
成功导入 bar.py

或者这样

>>> from demo import foo
成功导入 foo.py
>>> from demo import bar
成功导入 bar.py

3. 库

Python 库是指一定功能的代码集合,通常认为他是一个完整的项目打包。

库->包->模块,是从大到小的层级关系!

  • 库:一个库可能由多个包和模块组成

  • 包:一个包可能由多个模块组成

  • 模块:一堆函数、类、变量的集合