周结4
周结
目录
- 异常处理的语法结构
- 生成器对象
- 自定义range功能
- 生成器表达式
- 模块简介
- 模块导入的两种方式及扩展
- 模块的查找顺序
- 绝对导入与相对导入
- 包的使用
- 软件目录开发规范
- 常用内置模块之collections
- 常用内置模块之time datetime
- 常用内置模块之随机数random
- 常用内置模块之sys os
- 常用内置模块之json
异常处理的语法结构
try:
待监测的代码(可能会报错的代码)
except 错误类型 as e(变量名): e就是系统提示的错误信息
对错误类型的详情解析
万能异常:
try:
可能会出错的代码
except execption as 变量名:
对各种出错的异常做统一解析处理
结合else使用:
try里面的代码正常运行 没有报错则正常执行else子代码
结合finally:
无论try的子代码有没有报错最后都要执行finally的子代码
补充:
assert 断言 便是提前去预判他会不会报错
raise 主动报异常
生成器对象
内置有__iter_与__next__的迭代对象
迭代器对象是解释器自动提供的有数据类型与文件对象
生成器对象是程序员编写出来的
函数体代码中填写yield关键字
函数体代码中如果有yiled关键字 那么函数名加括号不会执行函数体代码 会生成一个生成器对象
使用加括号之后的结果调用__next__才会执行函数体代码
每一次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield
yield 还可以通过send传值给yield赋值号左边的变量名
自定义range功能
def my_range(first, second=None, third=1):
if not second:
second = first
first = 0
while first < second:
yield first
first += third
生成器表达式
就是生成器的简化写法
l1 = ( i + 1 for i in [11, 33, 55, 66, 66]) 就是个生成器对象
print(l1) # generator
模块简介
什么叫模块:一系列功能的结合体
模块的表现形式:
py文件(py文件也可以成为模块文件)
含有py文件的文件夹(按照模块功能的不同划分不同的文件夹存储) 等...
模块的三种分类
1.内置的:python解释器自带能够直接导入使用
2.第三方的:别人写好的发布在网上的 需要下载使用
3.自定义的:自己写的
模块导入的两种句式
一定得搞清楚谁是执行文件 谁是被导入文件
在做开发项目的时候py文件的名称一定得是英文 不能出现空格及中文
导入模块的时候不需要填写后缀名
1.import句式
1.先产生执行文件的名称空间
2.执行被导入的文件代码将产生的名字放入被导入文件的名称空间中
3.在执行文件的名称空间中产生一个模块的名字
4.在执行文件中使用该模块名点的方式使用模块名称空间所有的名字 并且肯定不会产生冲突
2.from...import...句式
1.先产生执行文件的名称空间
2.执行被导入文件的代码将产生的名字放入被导入文件的名称空间中
3.在执行文件中的名称空间中产生对应的名字绑定模块名称空间中对应的名字
4.在执行文件中直接使用名字就可以访问名称空间中对应的名字
但是在当前名称空间有相同名字的时候 就会产生冲突 使用的就成了当前名称空间
起别名:
既可以给模块起别名也可以给模块中的某个名字起别名
涉及到多个模块导入:
如果功能不同并不属于一个系列那么推荐分行导入
如果功能相似度高可以连续导入多个模块 但只有当多个模块相似时 或同属于一个系列的
通用导入:
from a import * *默认是将模块名称空间中所有的名字导入
__all__ = ['名字1', '名字2'] 针对*可以限制拿的名字
循环导入问题
循环导入:两个文件之间彼此导入并且相互使用名称空间中的名字 极容易报错
如何解决循环导入问题:应尽量避免出现循环导入问题
判断文件类型
所有的py文件都可以直接被打印__name__对应的值
当py文件是执行文件的时候__name__对应的值是___name__
当py文件是被导入文件时__name__对应的值是模块名
快捷方式 main >>> 直接生成 if __name__ == '__main__':
子代码
适应场景:
1.模块开发
2.项目启动文件
模块的查找顺序
1.先内存
2.再内置 自定义模块名尽量不要与内置模块名冲突
3.最后到执行文件的系统环境变量sys.path找 可以将模块所在的路径也添加到执行文件的sys.path中即可
绝对导入与相对导入
一定要分清楚谁是执行文件
模块的导入全是以执行文件为准
绝对导入
from mymd.aaa.bbb.ccc.ddd import name # 可以精确到变量名
from mymd.aaa.bbb.ccc import ddd # 也可以精确到模块名
就是按照项目根目录一层层往下查找
相对导入
.在路径中表示当前目录
..在路径中表示上一层
..\..在路径中表示上上一层目录
不再依据文件所在的sys.path 而是以模块自身路径为准
相对导入只能用于模块文件中 不能在执行文件中使用 它的频率使用较低
包的使用
多个py文件的集合>>>就是文件夹
内部含有__init__.py文件的文件夹 在python2看看是否有_init_.py文件夹内没有的话python2不认为是或者模块包 而在python3则没有这么多规则,只有py文件有功能代码就是模块
如果只想用包中某几个模块 还是按照之前的导入方式 form 包名 import 模块名
如果直接导包名 import 包名
导入包其实就是导下面的__init__.py文件 该文件内有什么名字就可以通过包名点的什么名字
软件开发目录规范
其实就是为了分类管理
1.bin文件 项目启动文件
start.py
2.conf 项目配置文件
seting.py
3.core 主要存放项目核心文件
scr.py 里面存放项目的核心功能
4.interface 存放项目接口文件
goods.py 根据具体的业务逻辑划分对应的文件
account.py
5.db 主要存放相关数据
userinfo.txt
db_handler.py 存放数据库操作相关的代码
6.log 主要存放项目的日志文件
log.log
7.lib 主要存放项目的公共功能
common.py
8.readme 主要存放项目相关说明
9.requirements.txt文件 主要存放项目所需的模块及版本
常用内置函数之collection
在内置数据类型(dict、list、set、tuple)的基础上 collections模块还提供了几个额外的数据类型
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
常用内置模块之时间模块time datetime
三种时间的表达方式
1.时间戳
2.结构化时间:主要是给时间看的 人看不适应
3.格式化时间:主要是给人看的
模块 time
import time
time.time 时间戳
time.steftime 时间字符串 time.strftime('%Y-%m-%d %H-%M-%s') %H-%M-%S相当于 %X 结构化时间参数若不传,则显示当前时间
字符串时间-->结构化时间
time.strptime(时间字符串,字符串对应格式)
>>>time.strptime("2017-03-16","%Y-%m-%d")
time.localtime 时间元组 将一个时间戳转换为当前时区的
time.sleep() 原地阻塞
时间戳是计算机能够识别的时间 时间字符串是人能够看懂的时间 元组则是用来操作时间的
模块 datatime
import datetime
print(datetime.datetime.now()) # 2022-10-19 18:08:13.680085
print(datetime.datetime.today()) # 2022-10-19 18:08:13.682081
print(datetime.date.today()) # 2022-10-19
c = datetime.datetime(2099, 10, 23, 12, 20)
print('指定日期:', c) # 指定日期: 2099-10-23 12:20:00
datetime.datetime.strptime('2022/10/15', '%Y/%m/%d') 不规则的时间表示形式转换为标准的时间格式 strptime
时间差值 做定时任务
import datetime
a = datetime.date.today()
print(a) # 2022-10-19
b = datetime.timedelta(days=6) # 设置一个时间差6天
# (days可以是seconds秒数也可以是minutes分钟\hours小时\weeks星期)
print(a + b) # 2022-10-25 # 6天之后
常用内置模块之随机数模块random
import random
random.randint() 随机产生0到1之间的小数
random.randint(1, 10) 随机产生1到10之间的整数
random.randrange(1, 20, 2) 随机产生1到20之间的奇数
random.choice(['一等奖', '二等奖', '三等奖']) 随机抽取一个样本 返回的是''
random.choices(['一等奖', '二等奖', '三等奖']) 可以自定义随机抽取的个数 返回的是[]
random.sample(['jason', 'kevin', 'tony', 'oscar', 'jerry', 'tom'], 3) 可以自定义随机抽取的个数
产生验证码:
code = ''
for i in range(4):
a = chr(random.randint(65, 90))
b = chr(random.randit(97, 122))
c - str(random.randit(0, 9))
temp = random.choice(a, b, c)
code += temp
print(code)
常用内置模块之os 模块
os模块主要与代码运行所在的操作系统打交道
dir就是dirrctory(计算机的) 目录,文件夹
import os
os.mkdir(r'd1') 在执行文件所在路径创建一个名字叫d1文件夹 一次只能创建一个
os.makedirs() 可以创建多级目录 也可以创建单级目录
是删目录
os.rmdir(r'd1') 可以删除单级目录 每次只能删一个 不可以一次性删除多级目录 只能删空的
os.removedirs(r'd2\d3') 可以删多级目录 只能删空的目录
获取指定路径下内容名称
os.listdir() listdir()括号里面什么都不写 默认获取当前路径下所有文件名称 也可以获取指定下路径的名称
是删文件
os.rename(r'a.txt', r'b.txt') 重命名文件 将a.txt重命名为b.txt 绝对路径也可以重命名
os.remove(r'aa.txt') 而相对路径 只能在当前目录下操作 绝对路径也能删文件,只删路径的最后的那一个
获取/切换当前工作目录
os.getcwd() 获取执行文件当前的目录
os.chdir('..') chdir路径切换 ..切换到上一级目录
动态获取项目根路径
注意绝对路径是包括执行文件本身的!!! os.path.abspath(_ _ file _ _) 绝对路径间是撬棍\
目录路径是不包含执行文件本身的!!!! os.path.dirname(_ _file _ _) 目录路径间是斜杠/
判断路径是否存在(文件、目录)
print(os.path.exists(r'01 os模块.py')) # 判断文件路径是否存在 True
print(os.path.exists(r'D:\pythonProject03\day19')) # 判断目录是否存在 True
这个更精确,就判断文件路径在不在
print(os.path.isfile(r'01 os模块.py')) # 判断路径是不是文件的路径 True
print(os.path.isfile(r'D:\pythonProject03\day19')) # 判断路径是否是文件 False
判断路径是不是目录
print(os.path.isdir(r'01 os模块.py')) # False
print(os.path.isdir(r'D:\pythonProject03\day19')) # True
路径拼接
os.path.join()
涉及到路径拼接一定不要自己做 因为不同的操作系统路径分隔符不一样
print(os.path.join(s1, s2)) # 一定要用path.join方法拼接路径
常用内置模块之sys 模块
sys.path 获取执行文件的sys.path
常用内置模块之jaon 模块
json模块也称为序列化模块 序列化可以打破语言限制实现不同编程语言之间数交互
dump 转存
load 载入
序列化的目的
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。
针对数据
json.dumps() 序列化:将某一数据类型转化成json格式字符串
json.loads() 反序列化:json格式字符串转化成某一个编程语言对应的数据类型
针对文件
json.dump() 将某一数据类型转化成json格式字符串写入文件 必须要有一个文件对象
json.load() 读取文件中json格式数据并反序列化成数据类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!