ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

异常捕获及生成器对象

2022-07-12 21:04:29  阅读:257  来源: 互联网

标签:__ num1 错误 捕获 生成器 l1 print 异常


  • 目录

    • 异常的结构
    • 异常的分类
    • 异常的类型
    • 异常捕获实现的目的及结构
    • 生成器对象
    • 生成器表达式
  • 异常:程序在运行过程中如果出现了异常会导致整个程序结束(bug)

  • 异常的结构

  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有