模块: ''' 模块: import | from 含义:一系列功能的集合体 优点: 1.文件级别管理代码 2.提高开发效率 导入 1.编译执行模块文件形成对应的pyc文件 2.形成模块的全局名称空间,存放模块中的名字 3.通过import关键字产生名字指向对应的地址(存放全局名称空间的地址) (一个文件产生一个全局名称空间,之间不互通) as 起名,原名字失效 自执行与模块的区分 __name__:==模块名()该文件为模块,被导入使用 __name__:==__main__该文件为自执行文件 ''' ------------------------------------------------------------------------- ------------------------------------------------------------------------- ------------------------------------------------------------------------- ------------------------------------------------------------------------- 包: 通过文件夹来管理一系列功能相近的模块 一系列模块的集合体 重点: 包中一定有一个专门用来管理包中所有模块的文件 包名: 存放一系列模块的文件夹名字 存放的是管理模块的文件的地址,指向全局名称空间 --( 包 )----------------------------------------------------------------------- --( 包 )----------------------------------------------------------------------- 重点:包 难点:包,循环导入 1.模块加载顺序 2.模块导入执行顺序 3.循环导入(*****) 4.创建并使用包 5.import 与 from 6.绝对导入,相对导入(***) --( 模块的加载顺序 )----------------------------------------------------------------------- --( 模块的加载顺序 )----------------------------------------------------------------------- 第一次导入:内存 > 内置 > sys.path(一系列自定义模块) 最终在自定义中找到,完成导入,并在内存中缓存模块的内存地址 再次导入,从内存中就可以直接找到, 即时当前文件为删除状态,内存中的地址仍然可以被引用 import time # (built-in)内置 print(time) import sys print(sys.path) --( 环境变量 )----------------------------------------------------------------------- --( 环境变量 )----------------------------------------------------------------------- 环境变量:存放文件路径的列表 重点:默认列表第一个元素就是当前被执行文件所在的目录 可以自定义往sys.path添加路径 sys.path.append(想添加文件的绝对路径) # 添加到末尾 def append(自定义): 'S.append(value)——将value追加到序列的末尾' sys.path.insert(0,想添加文件的绝对路径) # 添加到指定索引 def insert(self, index, value): insert(index, value)——在index索引 之前插入值。 --(导入模块的执行顺序 )----------------------------------------------------------------------- --(导入模块的执行顺序 )----------------------------------------------------------------------- 看图 (模块导入的执行流程) --(循环导入产生的问题 )----------------------------------------------------------------------- --(循环导入产生的问题 )----------------------------------------------------------------------- 两个模块之间相互导入,且相互使用其名称空间中的名字,但是有些名字没有产生 主要原因:流程顺序 再次导入是对名字的引用 from X (只进入) import Y (未调用) from 导入后马上会使用名字,但是没产生赋值,极容易出现错误 建议:使用import循环导入 --(解决循环导入的问题 )----------------------------------------------------------------------- --(解决循环导入的问题 )----------------------------------------------------------------------- 1.先定义,后引用 2.先提前产生名字,在导入模块 A = 32131 import from 导入后马上会使用名字,但是没产生赋值,极容易出现错误 3.在导入逻辑放在函数中,将导入的逻辑延后到函数的调用,还是先产生,后引用 --( 包的导入 (课件) )----------------------------------------------------------------------- --( 包的导入 (课件) )----------------------------------------------------------------------- 导包的点语法: import & from 导入包,点的左侧必须都是文件夹 import本质:通过查找环境变量中的绝对路径来完成导入 导包: 1.保证包所在文件夹在环境变量中 2.导入的文件夹就是包名 import pk pk(文件夹) 包含__init__.py文件 总结: 包名为文件夹名字,名称空间是由__init__.py产生 导包的点语法: import & from 导入包,点的左侧必须都是文件夹 使用保重模块中的名字:采用import导包 在包内置的 __init__.py 文件中不建议import管理名称,不建议起别名 在使用文件中 直接在要使用的文件中用import一层层找需要的名字 import 包名.文件名 as 别名 起完别名,原名不可以再使用 --( from & import导入区别 )----------------------------------------------------------------------- --( from & import导入区别 )----------------------------------------------------------------------- 导包点语法:左侧必须为文件夹 外界通过import导入方式最多只能导到模块 外界通过from可以访问到具体变量函数名 --( 绝对导入:包中使用import导入 )----------------------------------------------------------------------- --( 绝对导入:包中使用import导入 )----------------------------------------------------------------------- 在包的__init__文件中 import 模块名 (问题:所属包不在环境变量,报错) import 包名.模块名 (问题:包所属文件夹不在文件变量,报错) import 包名.模块名 as 别名 (外界都可以访问) import 包名.模块名.名 (问题:导包,点语法左侧必须都是文件夹) 外界... ... --( 绝对导入 )----------------------------------------------------------------------- --( 绝对导入 )----------------------------------------------------------------------- (绝对导入).jpg --( 相对导入 )----------------------------------------------------------------------- --( 相对导入 )----------------------------------------------------------------------- 点语法,一个点代表当前层,每加一个点提升一层级 from . import name (当前层) from .. import name (出一层) from ... 包 . import name (出两层)(又进一层) from . import name from . 表示当前文件的所在文件夹 __init__文件中的名,可由点语法直接调用 由相对导入 (点语法) 的文件都不能自执行