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.py
和 bar.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 库是指一定功能的代码集合,通常认为他是一个完整的项目打包。
库->包->模块,是从大到小的层级关系!
- 库:一个库可能由多个包和模块组成
- 包:一个包可能由多个模块组成
- 模块:一堆函数、类、变量的集合