模块和包—Day28
一、模块
模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
import的过程:import一个模块的时候,首先创建一个属于my_module的内存空间,加载my_module模块中的所有代码,将my_module中的名字和方法放在my_module的命名空间里,引用时将my_module带到当前名称空间中,用my_module.名字的方式使用。import模块名。
模块导入的原则:
1.如果不是必要的需求,所有的模块都有应该在文件的顶端倒入。
2.关于导入模块的顺序:先导入内置模块,再导入扩展模块,最后导入自定义模块。
3.模块不会被多次导入
导入多个模块:import a,b,c
为模块名起别名:import...as ....用于选择不同的模块来执行同一个功能
例:有两种摘要算法,json和pickle,根据输入选择用其中一个
inp = input('json or pickle>>>') if inp == 'ison': import ison as m elif inp == 'pickle': import pickle as m m.dumps({'k':'v'}) m.loads()
from...import...过程:创建一个属于my_module的名称空间,将my_module中的名字直接导入到引用模块的文件的名称空间中,在文件中直接使用my_module中的名字。from模块名import模块中的方法。
from...import...可以导入多个名字,也可以起别名,和import用法一样。
from模块import* 会默认把模块中所有的名字都导入到全局,和__all__一起使用
__all__ = ['a','A','func1'] #from 模块名import*时只能导入[]里面的内容
把模块当作脚本执行
如果一个py文件被导入了就是一个模块,如果这个py文件直接被执行了,这个被执行的文件就是一个脚本。
当一个模块被当做脚本执行的时候,__name__是一个字符串数据类型的‘__main__’。
当一个模块被当做模块倒入的时候,__name__是一个字符传数据类型模块名。
if __name__ == '__main__': #可以用来控制.py文件在不同的应用场景下执行不同的逻辑
编译python文件
一个文件如果作为模块会经常被导入,每次被导入都要经历一个被编译的过程,编译时会耗费时间,所以模块在第一次导入的时候被编译存在pyc文件里,之后的导入就可以直接用pyc文件中的字节码直接执行了。编译文件提高的是模块加载速递,不能提高程序运行速度。
二、包
包就是py文件的集合。
包的导入也分为两种:import和from...import...,凡是在导入时带点的,点的左边都必须是一个包
from a.b.c import d d.get() #abc都是包
import a.b.c.d a.b.c.d.get() #abc都是包
能不能导入一个包要看sys.path的路径下有没有这个包