- 模块
- 包
1、模块
一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能。
要引用模块名称空间中的名字,需要加上该前缀,模块名应该遵循小写形式。
1.1 import语句
import os # 导入模块
import time # 多次导入
import time as ti # 将导入的模块重命名
time.sleep(1) # 使用模块名.函数名调用
ti.sleep(1) # 直接使用修改过的模块名.函数调用
"""
导入顺序:
1. python内置模块
2. 第三方模块
3. 程序员自定义模块
"""
1.2 from-import 语句
from…import…与import语句基本一致,唯一不同的是:使用import time导入模块后,引用模块中的名字都需要加上time.作为前缀。
import os # 导入模块
from time import sleep # 可以直接调用sleep
from time import sleep as ts # 将导入的函数重命名
from time import * # 将模块内的所有东西导入,相同的会被覆盖,谨慎操作
sleep(1) # 直接使用函数名调用
ts(1) # 直接用修改过的函数名调用
1.3 搜索模块的路径与优先级
模块的四个通用类别,分别是:
1、使用纯Python代码编写的py文件
2、包含一系列模块的包
3、使用C编写并链接到Python解释器中的内置模块
4、使用C或C++编译的扩展模块
在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,然后按照从左到右的顺序依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,它是一个列表类型
模块的搜索路径
>>> import sys
>>> sys.path
['F:\\Program Files\\PyCharm Community Edition 2020.1.4\\plugins\\python-ce\\helpers\\pydev',
...,
'D:\\python']
# 导入的文件不在列表内可以自行添加
>>> sys.path.append('F:\Program Files')
>>> sys.path
['F:\\Program Files\\PyCharm Community Edition 2020.1.4\\plugins\\python-ce\\helpers\\pydev',
...,'D:\\python',
'F:\\Program Files']
1.4 if name == ‘main’
一个Python文件有两种用途,一种被当主程序/脚本执行,另一种被当模块导入,为了区别同一个文件的不同用途,每个py文件都内置了__name__变量,该变量在py文件被当做脚本执行时赋值为“main”,在py文件被当做模块导入时赋值为模块名
可以在文件末尾基于__name__在不同应用场景下值的不同来控制文件执行不同的逻辑
if的子代码块中编写针对模块功能的测试代码,这样py文件在被当做脚本运行时,就会执行测试代码,而被当做模块导入时则不用执行测试代码。
if __name__ == '__main__':
代码 #模块被当做脚本执行时运行的代码,#如果是被导入则不允许。
2、包
随着模块数目的增多,把所有模块不加区分地放到一起也是极不合理的,于是Python为我们提供了一种把模块组织到一起的方法,即创建一个包。包就是一个含有__init__.py文件的文件夹,文件夹内可以组织子模块或子包
pool/ #顶级包
├── __init__.py
├── futures #子包
│ ├── __init__.py
│ ├── process.py
│ └── thread.py
└── versions.py #子模块
2.1 导入包
1、包属于模块的一种,因而包以及包内的模块均是用来被导入使用的
2、关于包相关的导入语句也分为import和from … import …两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类
3、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间
4、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件