一、模块:
模块就是一系列功能的结合体
二、模块的来源:1.内置的(Python解释器自带的)
2.第三方的(别人写的.需要下载安装的)
3.自定义的(自己编写的)
三、模块的四种表现形式:
1.使用Python编写的Py文件(一个Py文件就是一个模块)
2.以被编译为共享或DLL的或c++扩展(了解部分)
3.吧一系列模块组织到一起的文件夹
4.使用C编写并连接到Python解释器的内置模块
四、为什么要用模块
1.用别人写好的模块(内置的,第三方的):典型的拿来主义,极大的提高了开发效率
2.使用自己编写的模块(自定义的):程序比较庞大的时候文件之间调用相同功能块的模块也提高了开发的效率,代码不冗余
五、如何使用模块: 一定要区分哪个是执行文件,哪个是被导入文件
1、import的使用:调用的格式 iimport time
自定义编写好的模块 可以在执行文件.py下调用运行(import 导入时只写文件名msd 不写后缀名.py)
执行的结果会:先进入模块msd执行里面的语句 再返回执行当前文件下的语句
模块的导入
执行run.py文件首先会创建一个msd.py的名称空间
首次导入模块(msd.py)
1.执行mSd.py文件
2.运行mSd.py文件中的代码将产生的名字与值存放到mSd.py名称空间中
3.在执行文件中产生一个指向名称空间的名字(mSd)
1、被导入模块有独立的名称空间
多次导入不会再执行模块文件,会沿用第一次导入的成果 第二次导入则开辟新的内存地址不在指向原来的,若要访问具体的内存地址直接print(msd.y)
money = 9999 def read1(): print('from run read1') # 访问模块中的名字指向的值 # print(md.money) # 使用import导入模块 访问模块名称空间中的名字统一句势:模块名.名字
2、使用import导入模块 访问模块名称空间的名字统一的格式:模块名.名字(md.money)
1.指明道姓的访问模块中的名字,永远不会与执行文件中的名字冲突
2.你如果想访问模块中的名字的话必须用 模块名,名字的方式
3、当几个模块没有联系的情况下 应该分多次导入,也可以一行导入(import os,time,md)但不支持,结构不清晰
import os import time import md # 通常导入模块的句式时会写在文件的开头
4、当模块名比较复杂的情况下,可以给该模块名取别名
import timehaohaoxuexi as t 修改别名为 t ptint(t.name)
六、使用模块之from ... import...
首次导入:
2.运行md.py文件内的代码,将产生的名字放到md.py文件的名称空间中
3.在执行文件中拿到一个名字改名字直接指向md.py名称空间中的某个名字
1、 from spam import read1,read2 # 在spam模块中导入 read1 和read2 所指的内存空间地址
2、from...import 与import的对比
from md1 import money # 多次导入不会执行 会沿用第一次导入的成果
3、利用from...import...句式
缺点:
1.访问模块中的名字不需要加模块名前缀
2.在访问模块中的名字可能会与当前执行文件中的名字冲突
七、from...import *(不推荐使用,消耗太多的资源)
from md1 import * # 一次性将md1模块中的名字全部加载过来 大部分情况下Python程序不应该使用这种导入方式 因为* 不知道导入的是什么名字,很有可能与之前定义的变量有重名,可读性极差,pycharm也会提示错误,但也可以运行 可以使用_all_来控制* 指定导入模块的具体参数
__all__=['money','read1'] # 这样在另外一个文件中用from spam import *就这能导入列表中规定的两个,制定导入的变量
八、循环导入的问题:同时调用两个模块,你导入我的,我导入你的
如果出现循环导入的问题,那一定是设计的程序不合理,循环导入问题应该在程序设计的阶段就应该避免
#m1.py print('正在导入m1') from m2 import y x='m1' #m2.py print('正在导入m2') from m1 import x y='m2' #run.py import m1
解决循环导入的问题方式:
1、将循环导入导入句式写在文件的最下方()
2、在函数内部导入模块(利用函数在定义阶段只检测语法不执行代码)
3、将循环导入的名字 放到另外一个文件中
九、Py文件的区分两种用途:模块与脚本
1、脚本,一个文件就是整个程序,用来被执行的 2、模块、文件中存放着一堆功能,用来被导入执行的 # 当文件被当做脚本执行时:_name_ 等价与 ‘_main_’ # 快捷写法 main直接tab键即可 # 当文件被当做模块导入时:_name_等于模块名 没有后缀名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name__ == '__main__'
十、模块的查找路径
模块的查找顺序是:内存中已经加载的模块->内置模块-> sys.path(相当于环境变量)路径中包含的模块
文件名不能与模块名(第三方,内置的)重复
#from dir1.dir import md import sys sys.path.append(r'D:\Python项目\day14\dir1') #手动添加环境变量 print(sys.path) from dir import md # 利用 from__name___按当前的文件夹路径查找
类似安装python时 .path 手动添加文件路径到环境变量 然后在终端才会默认从路径里查找到运行文件
system path:
查找模块的路径以执行文件所在的文件夹为准 demo -dir --md.py -run.py 第一种导入:基于当前执行文件所在文件夹路径依次往下找 第二种导入:直接将你需要导入的那个模块所在的文件夹路径添加到system path中
十 一、模块的绝对导入与相对导入
from dir1.dir import m1 m1.f1() """ 绝对导入必须依据执行文件所在的文件夹路径为准 1.绝对导入无论在执行文件中还是被导入文件都适用 相对导入 .代表的当前路径 ..代表的上一级路径 ...代表的是上上一级路径 注意相对导入不能再执行文件中使用 相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑 执行文件到底是谁 只需要知道模块与模块之间路径关系 """
十二、软件开发目录规范:
一个完整的软件开发的过程规范
项目名
bin文件夹
start.py项目启动文件
#==========>>satar.py import sys import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR) from core import src if __name__ == '__main__': src.run()
onf文件夹
settings.py项目配置文件
#========>>setting.py import os BASE_DIR=os.path.dirname(os.path.dirname(os.path.dirname())) DB_path=os.path.join(BASE_DIR,'db','db,join') LOG_PATH=os.path.join(BASE_DIR,'log','access.log') LOGIN_TIMEOUT=5
core文件夹
src.py项目核心逻辑
db文件夹
数据库相关文件
lib文件夹
common.py项目所用到的公共的功能
log文件夹
log.log项目的日志文件
readme.txt文本文件:项目简介