异常处理语法结构
异常处理实战应用
生成器对象
生成器对象实现range方法
生成器表达式
生成器笔试题
模块简介
今日内容详细
异常常见类型
SyntanxError 语法错误
NameError 名字错误
IndexError 索引错误
KeyError 键错误
IndentationError 缩进错误
...还有很多
异常处理语法结构
1. 基本语法结构
try :
待检测的代码(可能出错的代码)
except 错误类型:
针对上述错误类型制定的方案
2. 查看错误信息
try :
待检测的代码(可能会出错的代码)
except 错误类型 as e:
针对上述错误类型制定的方案
3. 针对不同的错误类型指定不同的解决方案
try :
待检测的代码(可能会出错的代码)
except 错误类型1 as e:
针对上述错误类型1 制定的方案
except 错误类型2 as e1:
针对上述错误类型2 制定的方案
except 错误类型3 as e2:
针对上述错误类型3 制定的方案
4. 万能异常
try :
待检测的代码(可能会出错的代码)
except Exception as e:
针对各种常见的错误类型全部统一处理
5. 结合else 使用
try :
待检测的代码(可能会出错的代码)
except Exception as e:
针对各种常见的错误类型全部统一处理
else :
try 的子代码正常运行结束没有任何的报错后,再执行else 子代码
6. 结合finally 使用(冷门)
try :
待检测代码(可能会出错的代码)
except Exception as e:
针对各种常见的错误类型全部统一处理
else :
try 的子代码正常运行结束没有任何的报错后,再执行else 子代码
finally :
无论try 的子代码是否报错,最后都要执行finally 子代码
异常处理补充
1. 断言
name = 'jason'
assert isinstance (name,str )
print ('肯定是字符串' )
name.strip()
2. 主动抛异常
name = 'jason'
if name == 'jason' :
raise Exception('老子不干了' )
else :
print ('正常走' )
异常处理实战应用
1. 异常处理能尽量少用就少用
2. 被try 监测的代码能尽量少就尽量少
3. 当代码中可能会出现一些无法控制的情况报错才应该考虑使用
eg: 使用手机访问网络软件 断网
编写网络爬虫程序请求数据 断网
课堂练习
l1 = [11 , 22 , 33 , 44 , 55 , 66 , 77 , 88 , 99 ]
res = l1.__iter__()
while True :
try :
ret = res.__next__()
print (ret)
except StopIteration as e:
break
生成器对象
1. 本质
还是内置有__iter__和__next__的迭代器对象
2. 区别
迭代器对象是解释器自动提供给我们的
数据类型、文件对象>>>:迭代器对象
3. 创建生成器的基本语法
函数体代码中填写yield 关键字
def my_iter ():
print ('嘿嘿嘿' )
yield
"""1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
"""
res = my_iter()
"""2.使用加括号之后的结果调用__next__才会执行函数体代码"""
res.__next__()
"""3.每次执行完__next__代码都会停在yield位置,下次基于该位置
继续往下找第二个yield"""
def my_iter ():
print ('嘿嘿嘿' )
yield
print ('哈哈哈' )
yield
print ('6666' )
yield
res = my_iter()
res.__next__()
res.__next__()
res.__next__()
"""4.yield也可以当做返回值使用"""
def my_iter ():
print ('嘿嘿嘿' )
yield 111
print ('哈哈哈' )
yield 222
print ('6666' )
yield 333
res = my_iter()
r1 = res.__next__()
print (r1)
r2 = res.__next__()
print (r2)
r3 = res.__next__()
print (r3)
课堂练习
自定义生成器对标range 功能(一个参数 两个参数 三个参数 迭代器对象)
for i in range (1 , 10 ):
print (i)
两个数字:
1. 需要跟range 方法一样,根据原方法模拟,定义
def my_range (star_num, end_sum ):
while star_num < end_sum:
yield star_num
star_num += 1
for i in my_range(1 , 10 ):
print (i)
---------------------------------------------------------------
一个数字:
def my_range (star_num, end_sum=0 ):
if end_sum == 0 :
end_sum = star_num
star_num = 0
while star_num < end_sum:
yield star_num
star_num += 1
for i in my_range(10 ):
print (i)
---------------------------------------------------------------
3 个数字:
def my_range (star_num, end_sum=0 ,my_lan = 1 ):
if end_sum == 0 :
end_sum = star_num
star_num = 0
while star_num < end_sum:
yield star_num
star_num += my_lan
for i in my_range(1 , 10 , 2 ):
print (i)
yield冷门用法
def eat (name, food=None ):
print (f'{name} 准备用餐' )
while True :
food = yield
print (f'{name} 正在吃{food} ' )
res = eat('jason' )
res.__next__()
生成器表达式
生成器的简化写法:
l1 = (i ** 2 for i in range (100 ))
print (l1)
for i in l1:
print (i)
"""
面试题(有难度)
大致知道流程即可
"""
def add (n, i ):
return n + i
def test ():
for i in range (4 ):
yield i
g = test()
for n in [1 , 10 ]:
g = (add(n, i) for i in g)
"""
第一次for循环
g = (add(n, i) for i in g) # 定义了一个生成器,g
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g)) 第二次for循环g就是 (add(10, i) for i in g
"""
res = list (g)
print (res)
"""正确选项是c"""
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现