其他分享
首页 > 其他分享> > 异常捕获及生成器对象

异常捕获及生成器对象

作者:互联网

  1. line关键字:表示代码错误存在的行数
  2. 最后一行冒号左边(NameError):表示代码错误的分类
  3. 最后一行冒号后边(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
  1. 语法错误:不允许出现的错误,当时发生当时修改
  2. 逻辑错误:允许出现的错误,查找错误
  1. SyntaxError:语法错误
  2. NameError:命名错误
  3. IndexError:列表索引超出范围错误
  4. KeyError:使用字典里不存在的key产生的错误
  5. TypeError:类型错误
  6. IndentationError:缩进错误
  1. 目的:当写的代码不确定是否报错时,提前预测可能出现的问题及解决的办法   
  2.  异常捕获基本结构:

               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 异常捕获尽量少用

  1. 生成器对象:本质是迭代器对象,定义一个yield为返回值的函数,调用函数就创建了一个生成器,再使用__inter__执行
  2. 目的:不依赖与索引取值,为了节省内存
  3. 语法结构: 
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