异常常见类型
SyntaxError 》》语法错误
NameError》》名称错误
IndexError》》索引错误
KeyError》》字典键错误
IndentationError》》缩进错误
异常处理语法结构
1.基本语法结构
try:
待监测的代码(可能会出错的代码)
except:错误类型
针对上述错误类型制定的方案
2.查看错误的信息
try:
待监测的代码(可能会出错的代码)
except:错误类型 as e :
针对上述错误类型制定不同的方案
3.针对不同的错误类型制定不同的解决方案
try:
待监测的代码(可能会出错的代码)
except 错误类型1 as e :
针对上述错误类型1制定的方案
except 错误类型2 as e :
针对上述错误类型2制定的方案
except 错误类型3 as e :
针对上述错误3制定的方案
4.万能异常Exception/baseExcption
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.异常处理能尽量少用就少用
2.被try检测的代码能尽量少就尽量少
3.当代码中可能会出现一些无法控制的 情况报错才应该考虑使用
eg:使用手机访问网络软件 断网
编写网络爬虫程序请求数据断网
课堂练习:
"""使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能"""
l1 = [11,22,33,44,55,66,77,88,99,100]
iter_l1 =l1.__iter__() #1.先把列表转换成迭代器对象
while True:# 2.用while 循环让迭代器对象反复执行__next__(双下next)
try:
print(iter_l1.__next__()) # 用双下next循环取出值
except StopAsyncIteration as e :
break# 停止循环
生成器对象
1.本质
内置有__iter__和__next__的迭代器对象
2.区别
迭代器对象是解释器自动提供的
数据类型/文件对象》》:迭代器对象(生成器)
3.创建生成器的基本语法
函数体代码中填写yield关键字
def my_iter():
print('haha')
yield
# def my_iter():
# print('哈哈哈 椰子汁很好喝')
# yield
'''1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
'''
res = my_iter()
'''2.使用加括号之后的结果调用__next__才会执行函数体代码'''
res.__next__()
'''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield'''
def my_iter():
print('哈哈哈 ')
yield 111, 222, 333
print('呵呵呵 ')
yield 111, 222, 333
print('嘿嘿嘿 ')
yield 111, 222, 333
print('哼哼哼')
yield 111, 222, 333
res = my_iter()
r1 = res.__next__()
print(r1)
r2 = res.__next__()
print(r2)
r3 = res.__next__()
print(r3)
r4 = res.__next__()
print(r4)
4.yield还有点类似于return 可以返回返回值
yield 冷门用法
def eat (name, food = None):
print(f'{name}进行准备
whlie True:
food = yield
print(f'{name}开始}
res = eat('jason')
res.__next__()
生成器表达式
生成器表达式就是生成器的简化写法
!主要就是为了节省内存
#列表生成式:
l1=[i for i in range(5)]
print(l1) #结果为:[0,1,2,3,4]
#生成器表达式(没有元组生成式)
l1=(i for i in range(5))
print(l1) #结果为:<generator object <genexpr> at 0x000002CECB2BE120>
#print(l1.__next__()) #结果为:0
#print(l1.__next__()) #结果为:1 需打印调用多次才可以取完
for i in l1:
print(i) #结果为:把0~4循环打印出来
标签:__,捕获,生成器,yield,next,print,异常,代码
From: https://www.cnblogs.com/lvqingmei/p/16800724.html