模块
十八、模块
模块:分为模块和包的形式。
通过对其它模块的引用,直接使用别的程序定义的变量,方法等,提高编程效率。
当一个文件为第一个运行,__init__ 属性== ‘__main__’ , 我们可以把它叫做主程序,引用其它模块来使程序运行。
当文件被当做模块导入到其它程序,它的__init__ 属性==’__模块名__’
导入模块的顺序:
内置模块
第三方模块
自定义模块:命名为纯小写字母加下划线
一个python文件就是一个模块,模块名就是.py前面的
模块的四种形式:
py文件
已被编译成共享库、dll等的c或c++扩展
把一系列模块组织到一起的文件夹,包,必须有一个__init__.py文件
用c编写并连接到python解释器的内置模块
导入模块的形式:
1)import 模块
首次导入模块要执行模块代码,产生名称空间,在当前文件中产生名字模块名,指向了模块运行的名称空间,之后的调入,不再执行
import foo
foo.x
import foo1,foo2
import ... as ...
可以在函数内导入模块
if __name__ == '__main__':
pass
当程序是主程序的时候,运行代码
当程序是主程序运行,它的name是'__main__'
被导入到别的程序时,它的name是'foo',也就是模块名
2)from foo import get
不存在foo这个名字
3)from foo import *
导入所有公有变量,方法,
该调用语句只能在最顶层使用,不能再在其它函数中以这种方式调用包中的变量,方法,
SyntaxError: import * only allowed at module level
但是,from ...import 具体的变量或者方法 的这条语句,就能在函数调用中使用
__all__ = ['变量','方法']
关于__all__:https://www.jb51.net/article/126875.htm
在模块中设置这个变量,在导入为*时,只能导入其中的变量和方法
该列表中所有的元素必须是字符串类型,每个元素对应foo.py中的一个名字
as:可以灵活运用起别名,判断不同的名字的模块一次执行其中一个,将他们都变为
一个名字,那么调用方式就统一了起来
关于导入中的问题:‘史’上雕花
循环导入:两个模块互相导入
解决方案:
方案一:导入语句放到最后,保证在导入时,所有名字都已经加载过
方案二:导入语句放到函数中,只有在调用函数时才会执行其内部代码
查找模块的优先级:
先从内存找,内置模块
然后从sys.path找:
运行文件的所在文件夹(永远不变,不管是终端运行还是pycharm运行),pycharm项
目的文件夹,第二个当不存在,因为在终端运行就变了,第三个也和pycharm有关,解
释器的压缩包,解释器文件夹,
sys.path.append(r'...')
定义一个模块的格式:
模块说明
导入模块
全局变量
类
方法
If __init__ == ‘__main__’:
pass
sys模块
sys.path # 环境变量
sys.path.append() # 添加你想添加的路径
sys.modules # 保存添加到程序中的模块,直到程序运行完成,才能释放
Python对模块导入的优化机制,一经导入,即使不再引用,也保存在空间里,直到程序结束,能提高程序的运行效率
类型提示:3.5 及以上
提示函数中形参的类型
def func(name:'提示信息',age:int = 11,hobbies:tuple)->int:
pass
.__annotations__ 查看提示信息
python 语言:解释型 强类型 动态型
模块的另一种模式:包
包含有__init__文件的文件夹
python2:
导入包,运行的是__init__文件,没有__init__就报错了
python3:没有__init__文件,也不会报错
包内可以有子模块,或子包
导入包,本质上就是执行包内的__init__文件
所以说,要把包里其他模块import到__init__中
绝对导入,从顶级目录也就是当前文件夹,import,通用的导入方式
from foo.foo1 import f1
相对导入:.当前文件夹 .. 上层文件夹,不能超出顶级文件夹,推荐相对导入
from .foo1 import f1
from a.b.c import f1
a,b 一定是包,只有最后一级c才允许是模块
相对导入只能用from module import symbol的形式,import ..versions语法是不对的,且symbol只能是一个明确的名字
from pool import futures.process #语法错误
from pool.futures import process #语法正确
环境变量是以主程序为准,确定了主程序后,sys.path的值就是确定的以主程序为准的
所以__init__,导入
os 和 sys 模块:
__file__当前文件的绝对路径
os.path.dirname() 看文件夹的名字
sys.path[0] 是绝对文件夹的路径,,,注意path方法的特征
rename覆盖原来的可以
replace的应用,是否有重复的