模块
一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
导入模块
import module名
导入模块时python会做三件事
1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam
3.创建名字spam来引用该命名空间
为模块起别名
import pandas as pd
在一行导入多个模块,不推荐(可读性不强)
import pandas ,os ,time
from module import 变量名
将模块当脚本执行
if __name__ == ‘__main__‘: main()
每一个py文件都有自己的__name__ 这条语句的作用:用来控制.py文件在不同的应用场景下执行不同的逻辑。
当该py文件被直接运行时,__nam__这条属性就是__mian__ ,条件成立,被执行。而当这个py文件被当模块导入时,这个__name__就等于该py文件的名字,条件不成立。可以用来测试。
模块搜索路径
python解释器在启动时会自动加载一些模块,可以使用sys.modules查看
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。
初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
dir函数
内建函数dir是用来查找模块中定义的名字,返回一个有序字符串列表
包(package)
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
__init__.py文件
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
关于__pycache__
当第一次运行 python 脚本时,解释器会将 *.py
脚本进行编译并保存到 __pycache__
目录
下次执行脚本时,若解释器发现你的 *.py
脚本没有变更,便会跳过编译一步,直接运行保存在 __pycache__
目录下的 *.pyc
文件