模块基础
模块是一系列功能的集合体,而函数是某一个功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。
-
自定义模块:如果你自己写一个py文件,在文件内写入一堆函数,则它被称为自定义模块,即使用python编写的.py文件
-
第三方模块:扩展模块
-
内置模块:使用C编写并链接到python解释器的内置模块
-
包:把一系列模块组织到一起的文件夹(注:文件夹下有一个init.py文件,该文件夹称之为包)
为什么要用模块
-
用第三方或者内置的模块是一种拿来主义,可以极大地提升开发效率。
-
自定义模块,将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。
一般我们使用import和from...import...导入模块
寻找模块
模块其实就是一个文件,如果要执行文件,首先就需要找到模块的路径(某个文件夹)。如果模块的文件路径和执行文件不在同一个文件目录下,我们就需要指定模块的路径。
模块的搜索路径指的就是在导入模块时需要检索的文件夹。
导入模块时查找模块的顺序是:
-
先从内存中已经导入的模块中寻找
-
内置的模块
-
环境变量sys.path中找
强调:sys.path的第一个值是当前执行文件的所在的文件夹
python文件的两种作用
python文件总共有两种用途,一种是执行文件;另一种是被当做模块导入。
编写好的一个python文件可以有两种用途:
-
脚本,一个文件就是整个程序,用来被执行
-
模块,文件中存放着一堆功能,用来被导入使用
包
什么时候是包
包是模块的一种形式,包的本质就是一个含有__init__.py
的文件的文件夹
为什么要有包
模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能
使用方法
导入模块发生的三件事:
-
创建一个包的名称空间
-
执行py文件,将执行过程中产生的名字存放于名称空间中。
-
在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
导入包发生的三件事:
-
创建一个包的名称空间
-
由于包是一个文件夹,无法执行包,因此执行包下的init.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于init.py)
-
在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
导入包就是在导入包下的init.py,并且可以使用以下两种方式导入:
-
import ...
-
from ... import...
注意事项
-
包内所有的文件都是被导入使用的,而不是被直接运行的
-
包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入
-
当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法
-
凡是在导入时带点的,点的左边都必须是一个包,
import aaa.bbb.m3.f3
错误