python异常捕获和生成器对象
异常捕获
1.程序中的异常指的就是代码在运行过程中出现的bug,通常会导致整个代码停止运行.
2.异常的结构:
File "D:/pythonProject7.12/生成器.py", line 7
=func()
^
IndentationError: unindent does not match any outer indentation level
- 关键字 line
能够精准的提示我们出现异常的代码具体在哪一行
- IndentationError
最后一行冒号左侧就是代码异常的类型
- 最后一行冒号的右侧则是来提示我们这段代码异常的原因
修改bug的关键点
3.常见的异常类型
NameError 变量名错误/异常
IndexError 索引错误/异常
KeyError k键错误/异常
SyntaxError 语法错误/异常
TypeError 类型错误/异常
IndentationError 缩进错误/异常
4.异常的分类
1.语法错误
对于程序员来说 语法错误是零容忍的
2.逻辑错误
是可以出现的,能够及时更正就可以了
异常捕获语法结构
1.常见语法结构:
try:
可能会出错的代码(被try监控)
except 错误类型1 as e: # e就是具体错误的原因
对应错误类型1的解决措施
except 错误类型2 as e: # e就是具体错误的原因
对应错误类型2的解决措施
except 错误类型3 as e: # e就是具体错误的原因
对应错误类型3的解决措施
except 错误类型4 as e: # e就是具体错误的原因
对应错误类型4的解决措施
#可同时写多种错误类型,提前预防
2.万能语法结构:
try:
# 可能出错的代码 (任何类型的异常都可以)
except Exception as e: # 万能异常方式1
print(e) #打印的是错误类型
except BaseException as e: # 万能异常方式2
#这种写法是上面的最初版本
print(e)
#优点就是不需要像第一种语法结构那样罗列各类型的异常语法,代码更简单
异常捕获练习
异常捕获的目的就是为了提前预防可能会出错的代码并提前给出措施!!!
建议代码能少用try就少用点 占用内存资源
for循环的本质
#使用while循环和异常捕获实现for循环的功能
l1 = [22,34,4,5,6,5,6,77,8,90]
#定义一个列表 依次取值
res = l1.__iter__()
#把列表变成迭代器对象
while True:
#循环列表取值
try:
#用异常捕获关键字 try 提前预防while循环取值异常程序报错
print(res.__next__())
#循环打印列表里的值
except Exception as e:
#Exception 万能异常处理关键词
break
#取值结束自动结束循环
生成器对象
1.生成器对象就是迭代器对象,只不过生成器是有我们自己自定义的迭代器对象,而迭代器对象是解释器自带的功能。
2.学习生成器对象的目的是为了优化代码
一种不依赖于索引取值的通用方式
可以节省数据类型的内存占用空间(主要)
yield关键字是组成生成器的关键字
eg:
#生成器
def func():
print('123')
yield 123 #当函数内有关键字yield 就由函数变成了生成器
func() #函数名加括号调用不了函数体代码
#<generator object func at 0x0000016617F6EEB8>
res = func()
print(res.__next__()) #只能用双下next方法调用
#打印123 返回123
yield 方法有返回值 类似于函数return方法
def func():
print('我是第一排')
yield 123
print('我是第二排')
yield 321
func()
res = func()
#print(res)
print(res.__next__()) #我是第一排 123
print(res.__next__()) #我是第二排 321
yield可以在函数体代码中出现多次
每次调用__next__方法都会从上往下执行直到遇到yield代码停留在此处
yield方法总结
1.函数加yield变成生成器
2.yield 后面加数据值会返回加的数据值
如果有多个数据值,用逗号隔开,也会自动组织成元组返回
yield后面如果没有填写数值 则返回None
3.yield 可以不限次数在函数代码体中出现
4.yield有几个生成器可以调用__next__几次
yield其他方法:
yield+send send()可以传递yield的值
def func(name,day=None):
print('今天要好好学习')
while True:
day=yield
print(f'{name}好好学习的第{day}天')
res = func('summer')
res.__next__()
res.send('100')
# 今天要好好学习
# summer好好学习的第100天
生成器表达式
l1 = (i**2 for i in range(10) if i > 3)
print(l1)
# <generator object <genexpr> at 0x000001A793439C10>
给节省内存空间 要调取数据的时候可以用for循环,list(),__next__方法
print(list(l1)) #[16, 25, 36, 49, 64, 81]
print(l1.__next__()) # 16 调一次取一个数
for i in l1:
print(i) # 16, 25, 36, 49, 64, 81
l1 = [i**2 for i in range(10) if i > 3]
print(l1) #列表生成式
#[16, 25, 36, 49, 64, 81]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现