总结4
总结4
异常与异常捕获
异常
异常是指程序过程中的代码报错,俗称bug。
代码异常存在语法错误和逻辑错误
我们要杜绝语法问题,尽量避免逻辑错误。
异常信息
python在遇到报错时,会给出报错的信息,包括异常位置、异常类型、异常详细三大信息。
异常捕获
语法:
try:
试运行代码
except 异常类型1 as e:
处理方案1
except 异常类型2 as e:
处理方案2
except 异常类型3 as e:
处理方案3
except Exception as e:
捕获所有异常类型并统一都执行此方案
else:
如果没有异常发生,则执行
finally:
不管有没有异常都执行
语法补充:
-
断言——assert
assert 值 # 这个值可以是普通变量,函数返回值等,当assert后的值为假属性时会报错。 -
主动抛异常——raise
# 当程序执行到某种地方的时候,我们让它主动报错 raise 异常类型(异常信息)
生成器对象
生成器对象概念
生成器对象就是可以自定义的迭代器对象,我们可以通过函数体内塞yield关键字的形式,定义一个迭代器体,每遇到一个yield,就作为每次迭代的停止点。
我们还可以通过yield进行每次返回值和每次接收值。
生成器有__iter__方法和__next__方法,而激活并执行过一次next方法的生成器可以执行send点方法。
def my_iter():
print('激活迭代器后的第一次next')
for i in range(10):
res = yield i
print(f'外面send个{res}给了我')
active_iter = my_iter() # 激活迭代器
print(active_iter.__next__()) # 激活迭代器后的第一次next 0
active_iter.send('嘿嘿') # 外面send个嘿嘿给了我 1
print(active_iter.__next__()) # 外面send个None给了我 2
每次yield断点,如果后面跟了值,那么每次迭代就相当于返回了一个值,可以记忆为迭代值。
send方法是传值的next方法,即在运行迭代器时,会往上次断点的yield传值,并通过赋值等手段传给函数体内部,作为变量值参与下一次的迭代。
如在第二次next时,因为res没有接收到外面的值,所以得到了一个None。
生成器表达式
简化的生成器,通过(表达式 for 变量名 in 迭代器/可迭代)的方式可以定义并激活一个生成器
强调:生成器的定义过程和激活过程,都不会使其函数体的内容被调用和运行。
只有当执行.__next__方法和.send()方法的时候,才会使生成器体内的代码迭代执行。
模块理论
python模块是具有一系列功能的集合,其可以表现为py文件、包、编译好的共享库、DLL的c或c++扩展、C编写并链接到python解释器的内置模块。
模块可以分为自定义模块、内置模块、第三方模块,其中第三方模块的是巨人的肩膀,有很多的功能强大的功能模块,或被开源,或在售卖,可以导入它们以简单的实现复杂的功能。
导入模块的句式及原理
import 模块名 和 from 上级目录\模块名 import 模块名\变量名
当执行文件的含import语句中遇到模块名时,会找到相应的模块先完整的执行一遍,然后执行完毕后,我们将在执行文件的名称空间中拿到import后的名字,如果是变量名则可以直接使用相关功能,如果是模块名则可以通过.变量的形式使用模块内部的名字。这个点的过程可以理解为.属性
注意:
-
在重复遇到import语句中含同样的模块内容时,只有第一次导入模块时会执行模块文件,后续导入同模块的语句不执行。
-
导入模块名或变量名时可以通过as来重命名
-
我们可以通过from 模块 import *的方式得到模块中所有的名字
而这种方式拿的名字也可以在模块中用
__all__指定 -
导入过程中应该避免循环导入的情况
判断当前文件是否是执行文件
- 模块开发者,需要试运行功能,但不希望被导入时执行
- 项目启动文件通常要判断
在以上两种情况时会需要判断自己是不是执行文件:
__name__是__main__的时候即为执行文件,否则为模块名时应该为被导入的模块。
可以用if __name__ == "__main__":来进行判断。
模块名的查找顺序
- 先找内存:这一点是针对已经被导入的模块文件,它的所有名称都已经在内存中了,
- 在找这些名字时,即使硬盘上的模块被删除,也不影响运行中的程序对这些已加载模块的调用- 再找内置模块:python解释器给我们提供的内置模块,有time、os等,这些模块名优先被查找
最后找系统环境变量下的模块:系统环境变量可以通过sys.path的方法获取,它由一系列目录组成,是程序运行的环境目录,其第一条通常为执行文件所在的文件夹。 - 我们最后就依次在系统环境变量的目录下查找有没有对应模块。
在导入模块时,我们应注意将自定义模块的名字与内置模块作区分,避免自定义模块失效,
所有的模块应该用英文命名,路径也尽量采取英文路径,不要包含空格等。
绝对路径导入和相对路径导入
from aaa.bbb.sub_b import name # 绝对路径导入模块(可以看到的文件夹打头)
# 多级文件夹用多个点来描述层级
from .bbb import sub_b # 相对路径导入模块(点或者点点打头,表示当前文件的某个相对位置)
# 需要说明
.在路径中表示当前目录
..在路径中表示上一层目录
..\..在路径中表示上上一层目录
包
多个py文件的集合>>文件夹。
我们一般会规范每个集合为包的py模块文件夹中含__init__.py文件(Python2中要求必须有,Python3中不作要求)
软件目录开发规范
myproject # 项目文件夹,可以自定义命名
- bin # 存放项目启动的文件 的文件夹
start.py # 启动文件,也可以命名为软件的名字等
- conf # 配置文件夹,全程configuration--配置
setting.py # 里面通常放一些大写的常量,作为软件起始需要的变量
- core # 核心文件夹,存放一些核心逻辑功能文件
src.py # 存放一些核心的功能
- interface # 接口文件,存放一些接口文件 # 接口可以理解为数据与用户的交互过渡层。
purchase.py
user.py
account.py # 根据业务逻辑分类对应某类功能的接口
- db # 数据及其处理文件夹 --- 可能被其他软件代替,如mysql
userdata.txt # 用户数据等数据文件
db_handler.py # 数据处理的相关功能
- log # 主要存放项目日志文件
log.log # 项目日志文件
- lib # 项目公共功能文件夹
common.py
- README.md # 项目说明书
- requirements.txt
# 模块环境说明书!!!一个字母不能错,这个文件可以帮助项目参与者快捷的下载模块
模块之collections
是一个提供各式各样数据类型的模块
| namedtuple | deque | OrderedDict | defaultdict | Counter |
|---|---|---|---|---|
| 具名元组 | 双端队列 | 有序列表 | 默认列表 | 元素出现次数字典 |
模块之时间模块
主要功能是提供三大时间获取、转换、运算的模块。
三大时间
时间戳、结构化时间、字符串时间(格式化时间)
时间戳与结构化时间都可以用于计算,结构化时间的运算习惯更符合我们的日常生活,但是其阅读起来并不方便,所以结构化时间可以转换为字符串时间和时间戳。
time模块
| 语句 | 功能 |
|---|---|
| time.sleep(1) | 程序等待1s后执行 |
| time.time() | 获取当前时间戳 |
| time.strftime("格式",结构化时间) | 结构化时间--->格式化时间、获取格式化时间 |
| time.localtime(时间戳) | 获取结构化时间、时间戳-->结构化时间 |
| time.mktime(结构化时间) | 将结构化时间变为时间戳 |
| time.strptime('时间字符串','字符串对应格式') | 识别字符串时间,转换为结构化时间 |
datetime模块
datetime可以看作结构化时间的一种,可以和字符串时间相互转化
| 语句 | 功能 |
|---|---|
| datetime.datetime.now() | 获取当前本地时间 |
| datetime.datetime(2008, 8, 8, 20, 0) | 用指定日期获取格式化时间 |
| datetime.datetime.strptime('时间字符串','对应格式') | 字符串时间-->datetime |
| 某个datetime时间.strftime('字符串时间格式') | datetime-->字符串时间 |
| datetime.timedelta(minutes=30) | 得到一个时间间隔 |
模块之random
| 函数名 | 功能 |
|---|---|
| random() | 随机得到0到1之间的小数 |
| uniform(a,b) | 随机得到a到b之间的小数 |
| randint(a,b) | 随机得到a和b之间的整数(包含a和b) |
| randrange(a,b,step) | 随机得到a和b间的整数,并设置步长 |
| choice(迭代器) | 随机获取迭代值,如列表的一个元素 |
| choices(迭代器) | 随机获取迭代值,如列表的一个元素,并组织为列表元素 |
| sample(迭代器,n) | 随机获取多个样本,并组织 成列表 |
| shuffle(数据集) | 随机打乱数据集 |
模块之os
| os.mkdir()\os.makedirs | 创建目录\多级目录 |
|---|---|
| os.rmdir()\os.removedirs() | 删除目录\多级目录(空目录) |
| os.listdir()\os.listdir('路径') | 查看执行\指定文件夹下的内容名称 |
| os.rename() | 重命名 |
| os.remove() | 删除文件 |
| os.getcwd() | 获取当前工作目录 |
| os.chdir() | 切换工作目录 |
| os.path.abspath() | 获取文件的绝对路径 |
| os.path.dirname() | 获取文件所在的文件夹路径 |
| os.path.exists()\isfile()\isdir() | 判断文件路径\文件\文件夹是否存在 |
| os.path.join() | 路径拼接 |
| os.path.getsize() | 获取文件大小(字节为单位) |
模块之sys
| 语句 | 功能 |
|---|---|
| sys.path | 获取系统环境变量 |
| sys.getrecursionlimit() | 获取解释器最大递归深度 |
| sys.setrecursionlimit() | 更改解释器最大递归深度 |
| sys.version | 获取解释器版本号 |
| sys.platform | 平台信息 |
| sys.argv | 从文件外部得到参数 |
模块之json
| 语句 | 功能 |
|---|---|
| json.dumps(python数据) | 序列化 |
| json.dump(python数据,文件) | 序列化并存入文件 |
| json.loads(json格式数据) | 反序列化 |
| json.load(f) | 读出文件并反序列化 |

浙公网安备 33010602011771号