今日内容
一、模块介绍
1、什么是模块
模块就是一系列功能的集合体
模块大致分为四种类别:(其中3、4只要会怎么用就行)
1、一个py文件就是一个模块,文件名叫test.py,模块名叫test
2、一个包含有__init__.py文件的文件夹称之为包,包也是模块
3、使用C编写并链接到python解释器的内置模块
4、已被编译为共享库或DLL的C或C++扩展
模块有三种来源:
1、自带的模块
2、第三方模块:pip3 install requests #社区下载模块的方式
3、自定义模块
2、为何要用模块
2.1:自带模块、第三方模块:拿来主义,提升开发效率(模块来源1,2只需要调用就可以)
2.2:自定义模块:为了解决代码冗余问题(即写重复代码问题)
3、如何用模块
模块都是用来被导入使用的,而不是直接运行的
导入模块语句会触发模块文件的运行
首次导入模块发生的事情:
1、运行模块文件,创建一个模块的名称空间,将模块文件运行过程中产生的名字都丢到模块的名称空间中
2、 在当前名称空间中得到一个名字,该名字是指向模块的名称空间
ps:后续的导入直接引用首次导入的成果,不会重复执行模块,不会重复创建名称空间
二、import导入
2.1模块的import导入与调用
import 模块名 #模块的导入
模块名.模块内的变量名 #模块的引用,如果是函数则加括号可以调用模块文件中函数的功能(名称空间的关系以定义阶段为准,与调用位置无关)
2.2导入规范
同常情况下所有的导入语句都应该写在文件的开头,然后分为三部分
1、先导入自带的模块
2、导入第三方模块
3、导入自定义模块
2.3import的其他用法
可以一行导入多个模块(不建议用)
import os,sys,re
可以给长名称模块名起个别名
import spam as sm
ps:调用时可以使用别名.变量名调用
优点:是指名道姓的调用模块内的变量名,与当前名称空间内变量名不冲突
缺点:每次导入模块内变量名都需要加模块名为前缀
三、from导入
3.1from的导入与调用
form 模块名 import 模块内变量名
例:
form spam import money
首次导入模块发生的事情:
1、运行模块文件,创建一个模块的名称空间,将模块文件运行过程中产生的名字都丢到模块的名称空间中
2、 在当前名称空间中得到一个名字money,该名字是指向模块的名称空间的那个money
优点:用起来简单,不用加模块名为前缀
缺点:会与当前名称空间内相同变量名起冲突,会被覆盖
3.2其他用途
可以一行导入多个模块内变量名
from spam import money,read1,read2
可以给长模块内变量名取别名
form spam import money as m,read1 as r1,read2 as r2
from spam import * #一次性将模块内所有变量名调用(不建议使用,会与当前执行文件变量名起冲突
可以在模块内加一行__all__ = ["money","read1"] #可以控制*能传几个变量名去执行文件中
四、循环导入问题
4.1循环导入存在的问题
1、当两个模块循环导入时可能会发生一个模块已创建名称空间在运行导入另一模块时下方变量名未能存入名称空间从而模块中变量名无法找到
4.2循环导入问题解决办法
1、不使用循环导入
2、当已使用循环导入时:
2.1:把模块中变量放在循环导入语句的上方
2.2:把循环导入语句放进函数中,然后在执行文件中再运行模块内函数功能
五、模块的搜索路径与优先级
5.1模块的搜索路径
1、内存中已经导入好的
2、python解释器内置模块
3、sys.path中 #记录了一个列表【文件路径】
5.2查找模块
1、查找同一文件夹下的不同文件夹模块
例:import 文件夹名.模块名 #引用
文件夹名.模块名.变量名 #调用
2、查找不同文件夹下的不同文件夹模块
例:import say #导入say模块
say.path.append(r'D:\python17') #将大文件夹加入环境变量中,让两个不同文件夹产生联系
import day02.m2
day02.m2.f2()
ps:自定义模块名称不要取和内置模块名称和第三方模块名称相同,遵循查找路径优先级会永远都找不到自定义模块
六、软件开发的目录规范
6.1目录规范:
1、文件夹名称为全小写,见名知意
2、各类文件夹命名规范及放置内容
bin--star.py(可执行程序)
conf---settings.py(配置文件,可以让用户自定义的配置,即各种变量)
log--logg.log(日志文件)
core--src.py(放置核心代码)
db--register(数据)
lib--common.py(模块,自定义模块,第三方模块)
readme:软件的说明书