今日内容
异常常见类型
NameError
IndentationError
SyntaxError
KeyError
SyntaxError
异常处理语法结构
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/BaseException
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) #断言name是不是字符串
print('哈哈哈哈')#断言不成功 那接下来的代码都不执行
2.主动抛异常
name = 'jason'
if name == 'jason': #如果名字是jason 报异常
raise exception ('不行')
else: #不是jason 正常走
print('正常走')
异常处理实战应用
1.异常处理能少用就少用
2.被try检测的代码能尽量少就尽量少
3.只有当代码中出现了 无法控制的的情况才应该考虑使用
eg:使用手机访问网络
编写网络爬虫程序数据请求 断网
l1 = [11,22,33,44,55,66]
list =l1.__iter__()
while True:
try:
print(list.__next__())
except StopIteration as e :
break
生成器对象
1.本质
内置有__iter__和__next__的迭代器对象
2.区别
迭代器对象是解释器自动提供的
数据类型\文件对象:迭代器对象
生成器对象是程序员编写出来的
代码、关键字:迭代器对象(生成器)
3.创建生成器的基本语法
函数体代码中填写yield关键字
#def m_ite():
# print('哈哈哈')
# yield
'''
1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
'''
res = my_iter()
'''2.使用加括号之后的结果调用__next__才会执行函数体代码'''
res.__next__()
'''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield'''
def my_iter():
print('哈哈哈哈')
yield 1,2,3
print('嘻嘻嘻')
yield 2,3,4,
res = my_iter()
r1 = res.__next__()
print(r1)
r2 = res.__next__()
print(r2)
'''4.yield 还有点类似于return 可以返回返回值'''
yield冷门用法
def eat (name,food=None):
print(f'{name}准备用餐')
while True:
food = yield
print(f'{name}正在吃{food}')
res = eat('jason')
res.__next__()
res.send('汉堡')#将括号内的数据传给yield前面的变量名 再自动调用__next__
res.send('薯条')
生成器表达式
就是生成器的简化写法
l1 = (i+1 for i in range (200))
print (l1)