前言
简单来说一个模块就是一个py文件,这个模块是存储很多相似的功能,相似的函数的集合体
- 节省代码
- 容易维护,组织结构更清晰
而模块主要分为下面三种 - 内置模块(标准库)python解释器自带的 time、os、sys等等
- 第三方库模块(大神自写)通过pip install…安装
- 自定义模块
这次主要分享自定义模块的部分,大的也可以分为以下几部分
import引用模块
-
当执行文件引用多次模块时,实际只加载一次
-
import LY #当我引用LY模块时,实际上将LY.py执行一遍,加载到内存 import LY import LY #只是第一次引用时,将此模块加载到内存 运行结果:from the LY.py
-
以下为执行文件和模块文件,以此来了解引用模块的过程
-
自定义模块.py(执行文件)
import LY n = 1
-
被引用文件(模板) LY.py
-
print('from the LY.py') name = 'LY' def read1(): print('LY模块', name) def read2(): print('LY模块') read1() def change(): global name name = 'XXL'
-
引用模块发生三件事
- 1、将LY.py文件加载到内存
- 2、在内存中创建一个以LY命名的名称空间
- 3、通过LY名称空间的名字.的方式引用此模块的名字(变量、函数名、类名等等)
三件事情图示:
第三步引用:
import LY
print(LY.name)
LY.read1()
LY.read2()
LY.change()
LY.read1()
运行结果:
from the LY.py
LY
LY模块 LY
LY模块
LY模块 LY
LY模块 XXL
通过import 引用模块,他有自己的独立空间,与当前执行文件无关系
模块名字.引用,一定在此模块中寻找
-
起别名:将一个比较长的模块名化简成简单的 import configure as cf
- 书写方便
- 简化代码
-
引入多个模块
-
import time,os,sys 不推荐
-
import time
import os
import sys 多行导入 易于阅读 易于编辑 易于搜索 易于维护
-
from … import … 引用模块
-
from LY import name from LY import read1 from LY import read2 print(globals()) 运行结果:...'name': 'LY', 'read1': <function read1 at 0x0000025F986CD430>, 'read2': <function read2 at 0x0000025F9894D3A0>}
相当于从LY模块的全局空间中将name,read1变量与值的对应关系复制到当前执行文件的全局名称空间中
-
优点:使用起来更加方便
-
缺点:容易与当前执行文件产生覆盖效果(import不易产生覆盖)
from LY import name print(name) name = 'xll' print(name) 运行结果:LY xll
-
坑:引用模块中的函数,如果此函数用到一些变量,这些变量还是从此模块中寻找,不会改变当前执行文件的变量(特殊情况,因为你引用一些模板的变量,必须做到执行文件中没有同名变量)
-
执行文件:from…import… .py
from LY import name from LY import change change() print(name) 运行结果:LY
-
eg:
from LY import change
change()
from LY import name
print(name)
运行结果:XXL
-
起别名:
from LY import name as n print(n)
-
引入多个模块:与import引用模块相同
from…import *(尽量别单独用)
-
1、所有名字全部复制
-
2、容易覆盖
-
配合使用:from … import * 与__all__配合使用
-
将*的所有范围缩小__all__
-
eg:__all__ = [‘read1’, ‘read2’] (写于模块中)
模块LY.py __all__ = ['read1'] 执行文件: from LY import * change() 运行结果:NameError: name 'change' is not defined
-
py文件的两种功能
- 1、执行文件(承载代码)脚本 直接打印__name__返回__main__
- 2、模块(被执行文件)直接打印__name__返回模块名
- 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码 ) if __name__ == ‘__main__’: …
-
模块的搜索路径:内存中 --> 内置模块 -->sys.path(模块可寻找的路径)中找
-
import sys print(sys.path) 运行结果:['C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\15day', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1', 'D:\\BaiduNetdiskDownload\\python39.zip', 'D:\\BaiduNetdiskDownload\\DLLs', 'D:\\BaiduNetdiskDownload\\lib', 'D:\\BaiduNetdiskDownload', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\venv', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\venv\\lib\\site-packages'] 看第一个参数为当前路径
-
应用:输出结果为列表,因此当文件不在此当前路径中时,我们可以考虑使用列表的添加操作
sys.path.append(r’C:\Users\ASUS\PycharmProjects\pythonProject1\16day’)
-