1.模块
模块是一系列功能的结合体
模块的三种来源:内置,第三方,自定义
模块的四种表现形式: 用python编写的py文件 已被编译为共享库或DLL的C或C++扩展(了解) 将一系列模块组织到一起的文件夹(包) 使用C编写并连接到python解释器的内置模块
模块极大的提高了开发效率(内置,第三方),当程序比较庞大时,一个项目的程序拆分多个py文件,将公共用到的方法写到一个py文件,其他文件以模块的形式调用, 知道哪个是执行文件,哪个是导入文件.
import导入模块
在运行执行文件时,会创建一个执行文件的名称空间 首次导入模块 1.执行导入文件 2.运行导入文件中代码,将产生的变量名和变量值放入导入文件的名称空间 3.在执行文件中产生一个指向名称空间的名字. 多次导入不会再执行模块文件,会沿着第一次导入的成果
函数名加括号在哪都可以调用函数,函数在定义阶段,名字查找就已经固定了,不会因为调用位置的变化而改变.
当几个模块有相同部分或者都使用一个模块,可以这样操作import os, time, md
当几个模块没有联系的情况下,应该多次导入.
import os
import time
import md
通常导入模块会写在文件开头, 当文件名比较复杂时,可以给模块名取值
异常有两类:
1.语法结构错误,需要修改,异常捕获无法完成
2.逻辑错误:异常捕获可以处理
d = (i for i in range(3))
while True:
try:
print(d.__next__()) # 0 1 2
except Exception:
break
while True:
try:
print(name)
except Exception:
break
name = "jason" # 异常捕获,不会报错
from import 导入模块
首次导入模块
先创建执行文件中的名称空间
1.运行导入模块
2.将产生的名字放到导入模块的名称空间
3.直接拿到指向导入模块的名称空间中的某个值的名字
缺点:
1.访问模块中的名字不需要加模块名前缀
2.在访问模块中的名字可能与当前执行文件中的名字冲突
__all__可以指定当所在py文件被当做模块导入的时候可以限制导入者能够拿到的名字个数
循环导入问题及解决思路
如果出现循环导入问题,说明程序设计的不合理,循环导入问题应该在程序设计阶段应该避免
解决循环导入问题的方式
1.方式1
将循环导入的句式写在文件最下方()
2.方式2
函数内导入模块
__name__用法 def index1(): print('index1') def index2(): print('index2') if __name__ == '__main__': # 快捷写法,main直接tab键 index1() index2() #当文件被当作执行文件执行时,__name__,打印结果是__main__ #当文件被当作模块导入时,__name__,打印结果是模块名(没有后缀)
模块的查找顺序 1.先从内存中找 2.内置中找 3.sys.path中找(环境变量): 一定要分清楚谁是执行文件谁是被导入文件 是一个大列表,里面放了一堆文件路径,第一个路径永远是执行文件所在的文件夹
绝对导入 绝对导入必须依据执行文件所在的文件夹路径为准 1.绝对导入无论在执行文件中还是被导入文件都适用 相对导入 .代表的当前路径 ..代表的上一级路径 ...代表的是上上一级路径 注意相对导入不能再执行文件中使用 相对导入只能在被导入的模块中使用,使用相对导入 就不需要考虑 执行文件到底是谁 只需要知道模块与模块之间路径关系
项目名
bin文件夹
start.py项目启动文件
conf文件夹
settings.py项目配置文件
core文件夹
src.py项目核心逻辑文件
db文件夹
数据相关
lib文件夹
common.py项目所用到的公共资源
log文件夹
log.log项目的日志文件
readme文件夹 文本文件 介绍项目
import sys import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) """ pycharm会自动将你新建的最顶层的目录自动添加到环境变量中 上面这两句话 不是针对你的 是针对下载你这个软件的用户 """ from core import src if __name__ == '__main__': src.run()