总结

异常

1.异常处理能尽量少用就少用
2.被try监测的代码能尽量少就尽量少
3.当代码中可能会出现一些无法控制的情况下才应该考虑使用

异常处理语法结构
1.基本语法
	try:
		待监测的代码(可能会出现异常的代码)
   except 错误类型:
		针对上述错误类型制定的方案
2.查看错误信息
	try:
		待监测的代码(可能会出现异常的代码)
   except 错误类型 as e:
		针对上述错误类型制定的方案
3.针对不同的错误类型制定不同的解决方案
	try:
		待监测的代码(可能会出现异常的代码)
   except 错误类型1:
		针对上述错误类型1制定的方案
	except 错误类型2:
		针对上述错误类型2制定的方案
	except 错误类型3:
		针对上述错误类型3制定的方案
	...
4.结合else使用
	try:
		待监测的代码(可能会出现异常的代码)
   except 错误类型 as e:
		针对上述错误类型制定的方案
	else:
		try子代码正常运行结束没有任何报错后再执行else的子代码
5.结合finally使用
	try:
		待监测的代码(可能会出现异常的代码)
   except 错误类型 as e:
		针对上述错误类型制定的方案
	finally:
		无论try子代码是否会报错 最后都会执行finally子代码

异常处理补充
1.断言
	name = 'jack'
	assert isinstance(name, str)
	print('hahaha')  # 当assert后面的条件成立不报错时 才会执行
2.主动抛出异常
	name = input('你是谁').strip()
	if name == 'jack':
		raise Exception('你谁啊') # 当判断条件成立时 会终止程序运行并报错
	else:
		print('来玩啊')

生成器对象

1.本质
	还是内置有__iter__和__next__的迭代器对象
2.区别
	迭代器对象是解释器自动提供的
		数据类型/文件对象>>>:迭代器对象
	生成器对象是程序员自己编写出来的
      代码/关键字>>>:迭代器对象(生成器)
3.创建生成器的基本语法
	函数体代码中填写yield关键字
	def my_iter():
		print('我执行了')
		yield 返回值
''' 函数体代码中如果有yield关键字 那么函数名加括号并不会执行函数体代码 而是会生成一个生成器对象(迭代器对象) 需要通过调用__next__()才会执行函数体代码
	当函数体代码中有多个yield时 每次执行完__next__代码都会停留在yield位置 下次基于该位置继续往下找到第二个yield
	yield还有点类似于return 可以返回返回值
'''

生成器表达式
	按需计算,即需要的时候才计算值,可以简单的理解为,每次向生成器对象中要一个元素,这个生成器对象才会返回一个元素
	说白了就是生成器的简化写法
l1 = (i ** 2 for i in rang(100))  # 此时的l1是一个生成器对象
print(l1)  # <generator object <genexpr> at 0x000001DFC07F7E40>
for i in l1:
    print(i)  # 依次从l1生成器中取值

索引取值与迭代取值的差异

1.索引取值
	可以任意位置任意次数取值 不支持无序类型的数据取值
2.迭代取值
	只能从前往后依次取值无法后退 支持所有类型的数据取值(有序的和无序的)
'''根据实际需求选择取值方式'''

模块

在python中,一个以.py为后缀名的文件,就叫做一个模块
python中模块的表现形式
1.py文件(py文件也可以称之为是模块文件)
2.含有多个py文件的文件夹(按照模块功能的不同划分不同的文件夹存储)
3.已被编译为共享库或者DLL或C++扩展
4.使用C编写并链接到python解释器的内置模块

模块的分类
1.内置模块
	就是python自带的可以直接调用的模块
2.自定义模块
	自定义模块就是自己写出来的模块
3.第三方模块
	第三方模块就是大佬们将已经写好了的发布在网上我们直接CV战士即可

导入模块的两种句式
1.import句式
	import 被导入模块名
	由于使用模块名称空间中的名字都需要模块名点的方式才可以用 所以不会轻	  易的将被执行文件中的名字替换掉
	但是每次使用模块名称空间中的名字都必须使用模块点才可以,比较麻烦
2.from ... import ...句式
	from 模块名 import 需要使用的名字
	起别名
		from 模块名 import 需要使用的名字 as 别名
	指名道姓的导入模块名称空间中需要使用的名字 不需要模块名点的方式使 	  用 但是容易跟执行文件中的名字冲突
'''导入模块时尽量避免循环导入 就是两个文件之间彼此导入彼此并且相互使用各自名称空间中的名字 极容易报错 如果必须循环导入 那么确保名字在使用之前就以及准备完毕'''

模块的查找顺序
	先从内存中去找,内存中没有的话会去内置中找,内置中找不到的话回去sys.path中找(系统环境变量)
执行文件所在的sys.path(系统环境变量)
	当模块和执行文件不在同一个目录时 直接导入也是会报错的
	可以将模块所在的路径也添加到执行文件的sys.path中即可
	sys.path.append(r'模块的路径')

模块的绝对导入与相对导入
1.绝对导入
	from mymd.aaa.bbb.ccc import name  # 可以精确到变量名
	from mymd.aaa.bbb import ccc  # 也可以精确到模块名
2.相对导入
	.在路径中表示当前目录
	..在路径中表示上一层目录
	..\..在路径中表示上上一层目录
	相对导入不再依据执行文件所在的sys.path 而是以模块自身路径为准
	from . import a
	相对导入只能用于模块文件中 不能再执行文件中使用
'''
相对导入使用频率较低 一般用绝对导入即可 结构更加清晰
'''

简单理解,包就是文件夹,里面是多个py文件的集合,只不过在该文件夹下必须存在一个名为__init__.py的文件
'''针对python2 python3可以没有 但为了兼容性考虑 最好还是加上__init__.py文件'''
1.如果只想用包中某几个模块 那么还是按照之前的导入方式即可
	from aaa import md1, md2
2.如果直接导入包名
	import aaa
	导入包名其实就是导包下面的__init__.py文件, 该文件内有什么名字就可以通过包名点什么名字调用  需要在__init__.py下导入包内的其他py文件

编程思想的转变

1.面条版阶段
	所有的代码全部堆叠在一起
'''第一个阶段可以看成是直接将所有的数据放在C盘  
	视频 音频 文本 图片 全部放在根目录下
'''
2.函数版阶段
	根据功能的不同封装成不同的函数
'''第二个阶段可以看成是将C盘下的数据进行分类管理 
	创建视频文件夹 音频文件夹 文本文件夹 图片文件夹 将对应的数据类型放在文件夹中
'''
3.模块版阶段
	根据功能的不同拆分成不同的py文件
'''第三个阶段可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
	系统文件夹 存放在C盘
	视频文件夹 存放在D盘
	图片文件夹 存放在E盘
可以让资源更加的高效管理
'''

软件开发目录规范

1.文件及目录的名字可以变换 但是思想是不变的 分类管理
2.目录规范主要规定开发程序的过程中针对不同的文件功能需要做不同的分类
项目文件夹/
|-	bin文件夹/				主要存放项目启动文件
|		start.py		启动文件可以放在bin目录下也可以直接放在项目根目录
|-	conf文件夹/			主要存放项目配置文件
|		settings.py		里面存放项目的默认配置 一般都是全大写
|-	core文件夹/			主要存放项目核心功能
|		src.py			里面存放项目核心功能
|-	interface文件夹/		主要存放项目接口文件
|  		user.py			根据业务逻辑划分对应的文件
|  		goods.py
|-	db文件夹/				主要存放项目相关数据
|		userinfo.txt
|  		db_handler.py	存放数据库操作相关的代码
|-	log文件夹/				主要存放项目日志文件
|		log.log
|- 	lib文件夹/				主要存放项目公共功能
|		common.py
|-	requirements.txt文件	 主要存放项目所需模块及版本
|-	readme文件			 主要存放项目相关说明

常用内置模块

collections模块

1.具名元祖
from collections import namedtuple
t1 = namedtuple('商品信息', ['品名', '价格'])
第一个参数表示类的名称,第二个参数是类的字段名。后者可以是可迭代对象,也可以是空格隔开的字符串
t2 = namedtuple('娃哈哈', 99) # 传参个数与可迭代对象中数据的个数相同

2.队列
	队列与堆栈
		队列:先进先出
		堆栈:先进后出

时间模块

'''
三种时间表现形式
	1.时间戳
		秒数
	2.结构化时间
		主要是给计算机看的 人看不适应
	3.格式化时间
		主要是给人看的
'''
1.time
import time
time.time()  # 获取时间戳
time.localtime()  # 获取结构化时间
time.strftime()   # 获取格式化时间 括号内需填写参数
'''  格式化时间参数
%Y 年 %m 月 %d 日 %H 时 %M 分 %S 秒 %X 时分秒
中间可以用任意字符隔开
'''
time.sleep()  # 原地阻塞程序 括号内填写数字 单位是秒

2.datetime
import datetime
datetime.datetime.now()  # 获取当前时间
datetime.datetime.today() # 获取当前时间
datetime.date.today()    # 获取当前日期
datetime.datetime.utcnow()  # 获取世界标准时间
datetime.datetime()  # 打印指定时间 括号内分别填写年月日时分秒 时分秒可以不传
datetime.datetime.strptime() # 将日期字符串转成datetime日期格式 
# 括号内填写两个参数 第一个是日期字符串 第二个是与日期字符串格式相同的格式化时间

随机数模块

import random
random.random()  # 随机产生0到1之间的小数
random.randint()  # 随机产生第一个数字与第二个数字之间的整数
random.randrange()  # 随机产生开头数字与结尾数字指定步长的整数
random.choice()  # 随机抽取一个样本
random.choices()  # 随机抽取一个样本 并保留原本的数据类型
random.sample()  # 随机抽取指定数量的样本数
random.shuffle()  # 随机打乱数据集

os模块

os模块主要与代码运行所在的操作系统打交道

import os
1.创建目录(文件夹)
os.mkdir()  # 创建单级目录
os.makedirs()  # 创建单级目录及多级目录
2.删除目录
os.rmdir()  # 删除单级空目录
os.removedirs()  # 删除多级空目录
3.列举指定路径下所有内容名称
os.listdir()
4.删除/重命名文件
os.remove()  # 删除指定文件
os.rename()  # 重命名指定文件
5.获取/切换目录
os.getcwd()  # 获取当前工作目录
os.chdir()  # 切换到指定目录
6.动态获取项目根目录
os.path.abspath(__file__)  # 获取当前执行文件的绝对路径
os.path.dirname(__file__)  # 获取当前执行文件所在目录的绝对路径
7.判断路径是否存在
os.path.exists()  # 判断文件或者目录是否存在
os.path.isdir()   # 判断目录是否存在
os.path.isfile()  # 判断是否是文件
8.路径拼接
os.path.join()
9.获取文件大小
os.path.getsize()  # 单位是字节

sys模块

sys模块时与python解释器交互的一个接口

import sys
sys.path   # 获取执行文件是sys.path
sys.getrecursionlimit()  # 获取python解释器默认的最大递归深度
sys.setrecursionlimit()  # 修改python解释器默认的最大递归深度
sys.version   # 获取python解释器的版本信息
sys.platform  # 获取当前系统平台
sys.argv  # 实现从程序的外部向程序传递参数 返回的是一个列表, 第一个元素是程序文件名, 第二个元素是程序外部传入的参数

json模块

json模块也称为序列化模块 序列化可以打破语言限制实现不同编程语言之间数据交互

json格式数据的形式
	字符串类型并且引号都是双引号
 import json
json相关操作
	针对数据
    json.dumps()  # 把特定的对象序列化处理为字符串
    json.loads()  # 反序列化 将json数据转换为外形相似的对应数据类型

 	针对文件
    json.dump()  # 将序列化的字符串写入文件
    json.load()  # 将文件中的内容反序列化
posted @ 2022-10-23 21:45  wwwxxx123  阅读(327)  评论(0编辑  收藏  举报