9月21日学习内容整理:模块和包
一、模块
1、模块是什么
(1)模块就是一个py文件,每次导入模块就是执行这个py文件
(2)一个模块多次(多次import同一个模块)导入也只执行一次,所以多次导入不会消耗内存
2、导入模块顺序
(1)内置模块:不用自己去装的,python自带的,比如re,time
(2)需要自己装的扩展模块
(3)自己写的模块
3、导入模块规则:不建议 import 模块1,模块2,模块3,...这样导入
4、模块的命名空间:
(1)模块有自己的命名空间
(2)要想用模块里的名字,必须用模块名.去引用
5、修改模块名字:import 原模块名 as 新模块名
6、模块的导入方法
(1)import 模块名(也就是文件名)
(2)from 模块名 import 函数名或变量名 as 新函数名或变量名
a) 模块这样导入时也会被执行模块文件的
b) 但是程序只能调用导入import进来的函数名或变量名,模块里别的东西没法调用
c)as 修改是为了避免模块和程序的函数或变量重名
d)可以导入多个函数或变量,以逗号隔开;也可以导入多行,用括号表示(函数1,
函数2,
函数3)
e)from 模块名 import * 这个*就代表导入模块里的所有名字,但是必须保证程序里没有重名的函数或变量,否则程序里的用不了。这个不常用
* 可以和_ _all_ _变量一起用,程序中有_ _all_ _变量时,只能调用_ _all_ _变量里的函数或变量,比如_ _all_ _=[ read1],这样程序就只能调用read1这个函数或变量了,如果
_ _all_ _为空,那就什么都引用不了
f)什么时候用from这种方法:一般模块较大,但是用到的模块里的函数或变量很少
7、若程序导入的模块1文件中还导入了模块2,那么程序中也可以用模块2的函数或变量,但是仍要用模块1的名字去引用
8、_ _name_ _的用法:
(1)在模块内部文件中或程序中_ _name_ _打印出来就是_ _main_ _
(2)在程序中导入模块,模块里的_ _name_ _在程序中打印出来就是模块的名字(也就是文件名字)
(3)应用场景:在模块里对_ _name_ _的值进行判断,这样在程序导入模块执行模块文件时就会有选择的执行某个或多个函数或命令,而不是一导入就全部执行
9、dir的用法:可以查看模块模块、函数、类等所定义的所有名字
导入builtins模块,dir(builtins)就可以查看所有的内置函数名字
模块补充:
1、导入sys模块,sys.modules就可以查看程序导入的所有模块
2、模块导入就全部放在内存中,在程序运行中修改模块文件中的代码是不会生效的,也不会执行的。但是导入importlib模块使用reload(模块名)再去修改就可以生效了
3、python -m 将py文件强制编译成pyc文件,pyc文件就是编译成的字节码文件,导入模块的时候会自动生成
4、sys.path 可以输出当前路径的列表,是列表类型可以追加和删除路径。这个路径就是程序导入模块时的依据,不在这个路径里的模块是导入不了的
二、包
1、什么是包
(1)有_ _init_ _.py文件
(2)有很多模块的组合
2、怎么导入包的模块
(1)对于别人写好的包,直接用就行
(2)自己写的包:
a) 如果模块和模块之间没有导入和联系,就不用关心绝对路径导入和相对路径导入的问题
b)如果模块和模块之间存在导入和联系,就要用到绝对路径和相对路径
绝对路径导入:导入的路径会随着包与文件之间关系的变化而变化,在包内部、外部都可以执行 from 包名 import py文件名
相对路径导入:一次写好的模块的导入关系,不需要关心模块和文件之间的关系只能在包的外面执行 from . import py文件名
一个点代表代表当前目录,两个点代表上层目录
注意:
(1)这里的相对路径和绝对路径指的是模块与模块之间有联系时使用的,一般推荐相对路径,因为绝对路径可能会变
(2)相对路径只能在包外部执行,指的是模块与模块之间联系用相对路径导入的话在模块内部无法执行的,只有在执行包外部文件的时候模块与模块之间的这个相对路径导入才会生效,不是指只能在包外部使用相对路径导入
3、_ _init_ _文件的用法
(1)程序导入包的模块时,会先执行_ _init_ _文件,就像类的_ _init_ _函数初始化一样
(2)若在_ _init_ _文件里就导入包中的模块,导入_ _init_ _所在的文件名,就可以直接引用_ _init_ _导入的模块里的方法了