模块:别人写好的函数、变量、方法,放在一个文件里(这个文件可以被我们直接使用)这个文件就是个模块
.py dll文件 zip文件
自己创建一个py文件,给他起一个符合变量名命名规则的名字,这个名字就是模块名
模块的导入:
模块导入的过程中发生了什么
找到这个模块
判断这个模块是否被导入过了
如果没有被导入过
创建一个属于这个模块的命名空间
让模块的名字指向这个空间
执行这个模块中的代码
import 模块名
模块的导入想当于这个模块所在的文件被导入,模块的多次导入不会重复执行。
命名空间
为模块起别名 as 语句 (起了别名之后,使用这个模块就只能用这个别名了)
一行导入多个模块:(顺序)内置、第三方、自定义
from import 也会执行文件,但是import了什么,就只能用什么
命名空间 名字引用模块中的名字
为导入的名字起别名
一行导入多个名字
*和__all__的关系:__all__只能约束*导入变量的内容
from my_module import * (默认是导入所有,但是__all__=[“a”]列表没有的就不会被导入)
模块引用中的情况:
1.模块的循环引用***
模块之间不允许循环引用
2.模块的加载与修改*
已经被导入的模块发生了修改,是不会被感知的
要想修改的模块被正在运行中的程序感知到,重启这个程序
3.把模块当成脚本执行*****
执行一个py文件的方式:
1.在cmd执行,在pytho执行:直接执行-以脚本的形式
2.导入这个文件
脚本:直接运行的文件,都是py文件,能独立的提供一个功能,能自主完成交互
模块:导入这个文件 ,都是py文件,能够被导入调用这个功能,不能自主交互
if __name__ == "__main__" 当文件被当做脚本的时候
代码 当文件被当成模块导入的时候 __name__ =="模块的名字"
下载这里面的代码只有这个文件被当做脚本执行的时候才会执行
4.模块的搜索路径*****
和被当做脚本执行的文件,同目录下的模块,可以被直接导入
除此之外其他路径下的模块,在被导入的时候需要自己修改sys.path列表
包
包:文件夹中有一个__init__.py文件
包:是几个模块的集合
直接导入包,需要通过设计init文件,来完成导入包之后的操作
导入一个包
不意味着这个包下面的所有内容都是可以被使用的
导入一个包到底发生了什么
相当于执行了这个包下面的__init__.py文件
绝对导入:
在执行一个py脚本的时候,这个脚本以及和这个脚本同级的模块中只能用绝对导入
缺点:
所有的导入都要从一个根目录下往后解释这个文件夹之间的关系
如果当前导入包的文件个被导入的包的位置关系发生了变化,那么所有的init文件都要做相应的调整
相对导入:
不需要去反复的修改路径
只要一个包中的所有文件夹和文件的相对位置不发生改变
也不需要去关心当前这个包和被执行的文件之间的层级关系
缺点:
含有相对导入的py文件不能直接被执行
必须放在包里被导入的调用才能正常使用