生成器

今日内容概要

异常捕获

1.如何理解异常
异常就是程序运行中的bug 会导致整个程序运行结束
2.异常的机构分为三个
1.关键字line所在行,提示第几行出错了
2.最后一行冒号左侧错误的类型
3.最后一行冒号的右侧错误的具体原因
3.异常的类型
NameError
IndexError
ListError
TypeError
4.异常的分类
1.语法错误
不允许出现   出现必须立刻修改
2.逻辑错误
允许出现  允许出错之后修改即可
写代码自己跑一遍

异常捕获实际操作

当不确定是否会出错,提前预测可能会出现问题并提前给出处理措施
1.基本语法结构
try:
    l1 =[]
    l1[100]
except NameError:  # 变量名错误
    print('name not difend')
except IndexError as e:  # 可以打印e让软件自动提示也可以自己打印提示
    print('超出索引范围')
    print(e)
except 错误类型 as e:
print(e)
#except 可以写多行预测多个情况
print(123)
2. 万能异常
try:
	异常代码
except  Exception as e: 万能预测所有逻辑错误都可以处理
	print(e)
try:
    jaosn

    name = 'tony'

except Exception as e:  #如果出错就打断程序执行子代码
    print(e, '出错走这里')
else:  # 不出错执行下面这个
    print('没出错真厉害')
finally:
    print('无论是否出错我都走')
断言预测
name = 'jaosn'
assert isinstance(name,list)  # 猜对了运行猜错了报错
print('针对name数据使用列表的相关操作')
主动报错
username = input('name:')
if username == 'jason':
    raise Exception('自毁程序')  # 主动异常 如果输入的用户是jason主动报错
else:
    print('不是jason')

异常捕获建议能少用就少用,被try检测的代码能少就少

异常捕获练习

1.for 循环底层
l1 = [1,2,3,4,5,6,8]
res = l1.__iter__()
while True:
    try:
        print(res.__next__())  #打印取值的数据
    except Exception:  #不知道报错原因使用万能
        break
'''
1.先看具体报错信息
2.再看报错的位置
从下往上看
3.尽量讲错误缩小到某个具体的数字


'''

自定义迭代器对象

1.生成器对象本质就是迭代器对象,迭代器是解释器提过给我们现成的
生成器对对象是我们自定义的
iter 和__nxet__
2.学习生成器对象目的就是为了简化代码
一种不依赖于索引取值的通用方式
可以节省数据类型的内存占用空间
3.生成器对象的代码实现


def func():
    print('你好')
    yield  # 可以在函数体代码中出现多次能够让代码停住
    print('我在第二层')
    yield  123  # 后面可以跟返回值参数 打印的时候 打印双下调用双下next即可获取
print(func)  # <function func at 0x109e65ea0>  函数
res = func()
#当函数体代码中有yield 第一此调用不会运行
print(res)  # <generator object func at 0x1006cb7d8>  生成器对象
res.__next__()
res.__next__()
res.__next__()  # 函数体代码里有多少个关键字就只能调多少次没有就报错每次调用就会停在那一层

自定义迭代器练习题

编写生成器实现range功能
def index(star,end = None, step = 1):
    if step < 1:
	    step = 1
    if not end:
        end = star
        star = 0
    while star < end:
        yield star
        star += step
for i in index(1,99,5): 
    print(i)

yield其他方法

def func(name,food = None):
    print(f'{name}准备干饭')
    while True:
        food = yield
        print(f'{name}吃{food}')
res = func('tony')
res.__next__()
res .send('狗粮')  # send 传值并自动调用__next__
res.send('猫粮')
res.send('西北风')

生成器表达式

列表生成式
l1 =[i**2  for i in range(10) if i >3]
l1 =(i**2  for i in range(10) if i >3)
posted @ 2022-07-12 18:38  懒羊羊A  阅读(58)  评论(0)    收藏  举报