异常捕获及生成器对象
作者:互联网
-
目录
- 异常的结构
- 异常的分类
- 异常的类型
- 异常捕获实现的目的及结构
- 生成器对象
- 生成器表达式
-
异常:程序在运行过程中如果出现了异常会导致整个程序结束(bug)
-
异常的结构
-
line关键字:表示代码错误存在的行数
-
最后一行冒号左边(NameError):表示代码错误的分类
-
最后一行冒号后边(name 'name' is not defined):表示代码错误的原因
D:\Python\python.exe D:/code/python/day21/01异常捕获.py Traceback (most recent call last): File "D:/code/python/day21/01异常捕获.py", line 1, in <module> name NameError: name 'name' is not defined
-
异常的分类
-
语法错误:不允许出现的错误,当时发生当时修改
-
逻辑错误:允许出现的错误,查找错误
-
异常的类型
-
SyntaxError:语法错误
-
NameError:命名错误
-
IndexError:列表索引超出范围错误
-
KeyError:使用字典里不存在的key产生的错误
-
TypeError:类型错误
-
IndentationError:缩进错误
-
异常捕获实现的目的及结构
-
目的:当写的代码不确定是否报错时,提前预测可能出现的问题及解决的办法
-
异常捕获基本结构:
try:
错误代码
except 错误类型 as e(错误的具体原因)
错误的解决办法
l1 = [1, 3, 5] try: print(l1[5]) except IndexError as e: print('出现错误') # 出现错误
3.异常捕获的万能结构
try:
错误代码
except as Exception(BaseException) e(e错误的具体原因)
print(e) (错误的解决办法)
l1 = [1, 3, 5] 1.try: print(l1[5]) except Exception as e: print('出现错误') # 出现错误 2.try: print(l1[5]) except BaseException as e: print('出现错误') # 出现错误
4.异常捕获的其他操作
4.1 try...except....语句与else及finally使用
4.1.1 else是异常处理时的可选分支,必须在except的分支之后,代码未出现错误执行该分支
4.1.2 finally是无论代码正确或错误都会执行该分支
l1 = [1, 3, 5] try: print(l1[5]) except BaseException as e: print('代码出现错误执行') # 代码出现错误执行 else: print('代码没有出现错误执行') finally: print('无论代码正确或错误都会执行') # 无论代码正确或错误都会执行 try: print(l1[2]) # 5 except BaseException as e: print('代码出现错误执行') else: print('代码没有出现错误执行') # 代码没有出现错误执行 finally: print('无论代码正确或错误都会执行') # 无论代码正确或错误都会执行
4.2 断言 assert:判断布尔值是否为True ,不是直接报错终止运行
l1 = [2, 3] l2 = [4, 5] assert l1>l2
4.3 主动抛异常 raise:引发异常
username = input('请输入用户姓名>>>:') if username == 'kevin': raise NameError('是kevin') else: print('不是他')
4.4 异常捕获尽量少用
-
生成器对象
-
生成器对象:本质是迭代器对象,定义一个yield为返回值的函数,调用函数就创建了一个生成器,再使用__inter__执行
-
目的:不依赖与索引取值,为了节省内存
-
语法结构:
def func(): print('生成器') # 生成器 yield 123 res = func().__next__() print(res) # 123
4.执行步骤: 函数调用时不执行,将函数变为生成器,函数体代码中可存在多个yield,每次调用__inter__,从上往下执行,遇到yield停止
def func(): print('123') yield 123 print('321') yield 321 res = func() res.__next__() # 123 res.__next__() # 321
5.yield.......send
def index(name,pwd=None):
print(f'他是{name}')
while True:
pwd = yield
print(f'{name}的电脑密码{pwd}')
res = index('kevin')
res.__next__()
res.send('4321') # 传值并自动调用__next__方法
6.异常捕获练习
# 1.for循环内部的本质 l1 = [1, 4, 5, 7, 22] res = l1.__iter__() while True: try: print(res.__next__()) except Exception as e: break
-
生成器表达式
1.先执行for循环将一个个数值取出交给if判断,然后将符合条件的数据交给for前面的条件去执行
l1 = [i+1 for i in range(10)] print(l1) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] l1 = [i+1 for i in range(10) if i > 5] print(l1) # [7, 8, 9, 10]
2.练习
# 利用生成器实现range方法 # 1.只存在2个参数 def my_range(num1,num2): # 2.判断形参大小 while num1 < num2: yield num1 num1 += 1 for i in my_range(2,5): print(i) # 2.存在1个参数 def my_range(num1,num2=None): if not num2: num2 = num1 num1 = 0 # 2.判断形参大小 while num1 < num2: yield num1 num1 += 1 for i in my_range(2,5): print(i) # 3.存在3个参数 def my_range(num1,num2=None,num3=1): if num3 < 1: num3 = 1 if not num2: num2 = num1 num1 = 0 # 2.判断形参大小 while num1 < num2: yield num1 num1 += num3 for i in my_range(2,5,2): print(i)
标签:__,num1,错误,捕获,生成器,l1,print,异常 来源: https://www.cnblogs.com/040714zq/p/16470954.html