异常处理语法结构、yield生成器及其生成器表达式

  • 异常处理语法结构
  • 异常处理实战应用
  • 生成器对象
  • 自定义range功能
  • yield冷门用法
  • yield与return对比
  • 生成器表达式
  • 笔试题

异常处理语法结构

# 常见的异常类型
SynataxError  语法错误
NameError  变量名错误
IndexError  索引错误
KeyError  键取值错误
IndentationError  缩进错误
TypeError: must be str, not int  类型错误
# 数据类型错误,该数据不是正确的数据类型,⽐如字符串和数字直接拼接,检查⼀下数据类型
ValueError: substring not found  值错误
# 值错误,输入的数据类型跟要求的不符合
TabError:Tab错误
# 相邻的两句的缩进需要统一使用tab或统一使用空格,不能混用,否则就会出现报错


1.基本语法结构
	try:
        待监测的代码(可能会出错的代码)
    except 错误类型:
        针对上述错误类型制定的方案
2.查看错误类型
	try:
        待监测的代码(可能会出错的代码)
    except 错误类型 as e: # e就是系统提示的错误信息
        针对上述错误类型制定的方案
3.针对不同的错误类型制定不同的解决方案
	try:
        待监测的代码(可能会出错的代码)
    except 错误类型1 as e: # e就是系统提示的错误信息
        针对上述错误类型1制定的方案
    except 错误类型2 as e: # e就是系统提示的错误信息
        针对上述错误类型2制定的方案
    except 错误类型3 as e: # e就是系统提示的错误信息
        针对上述错误类型3制定的方案
    ...
    
4.万能异常 Exception/BaseException
	try:
        待监测的代码(可能会报错的代码)
    except Exception as e:  #e就是系统提示的错误信息
        针对各种常见的错误类型全部统一处理
5.结合else使用
	try:
        待监测的代码(可能会出错的代码)
    except Exception as e:  #e就是系统提示的错误信息
        正对各种常见的错误类型全部统一处理
    else:
        try的子代码正常运行结束没有任何的报错后 再执行else子代码
6.结合finally使用
	try:
        待监测的代码(可能会出错的代码)
    except Exception as e:  # e就是系统提示的错误信息
        针对各种常见的错误类型全部统一处理
    else:
        try的子代码正常结束没有任何的报错后 再执行else子代码
    finally:
        无论try的子代码是否报错 最后都要执行finally的子代码

# 异常处理补充
1.断言
name = 'jason'
assert isinstence(name, int) # 提前去判断它是不是整型 是的话打印下面一句 不是则报错断言错误错误
print('好好学习')
2.主动报异常
name = 'jason'
if name == 'jason':  # 当name是jason的时候就主动报错:raise Exception('啊哈') Exception: 啊哈
    raise Exception('啊哈')
else:
    print('哦豁')

image

异常处理实战应用

1.异常处理能尽量少用就少用
2.try监测的代码能尽量少用就少用
3.当代码中可能会出现一些无法控制的情况才应该考虑使用
如:使用手机访问网络软件 断网
	编写网络爬虫程序请求数据 断网
练习:
使用while循环+异常处理+迭代器对象 完成for循环迭代取值得功能
l1 = [11, 33, 44, 55, 33, 66, 77, 33, 99]
# 1.首先将列表调用_iter_转变成迭代器对象
res = l1.__iter__()
# 2.while循环让迭代器对象反复执行_next_
while True:
    try:
        print(res.__next__())
    except Exception as e:
        break

生成器对象

1.本质
	还是内置有_iter_和_next_的迭代对象
2.区别
	迭代对象是解释器自动提供的
    	数据类型\文件对象>>>:迭代器对象
    生成器对象是程序员编写出来的
    	代码、关键字>>>: 迭代器对象(生成器)
3.创建生成器的基本语法
	函数体代码中填写yield关键字
    def my_iter():
        print('我爱学习')
        yield
        '''
        函数体代码中如果有yield关键字
        那么函数名加括号不会执行函数体代码
        会生成一个生成器对象(迭代器对象)
        '''
        res = my_iter()
        '''
        使用加括号之后的结果调用_next_才会执行函数体代码
        '''
        res._next()
        '''
        每次执行完_next_代码都会停在yield位置 下次基于该位置继续往下找第二个yie
        '''
        
def my_iter():
    print('哈哈')
    yield 11, 22, 33
    print('呵呵')
    yield 11, 22, 33
    print('嘿嘿')
   yield 11, 22, 33
res = my_iter_()
r1 = res._next_()
print(r1)  # 哈哈 (11 22 33)
r2 = res._next_()
print(r2)  # 呵呵 (11 22 33)
r3 = res._next_()
print(r3)  # 嘿嘿 (11 22 33)

自定义range功能

自定义生成器实现跟range方法一样的功能(一个参数 两个参数 三个参数)
for i in range(1, 10):
    print(i)
    
def my_range(first, second=None, third=1):
# 判断second是否有值 没有值说明用户只给了一个值 起始数字应该是0 终止位置应该是传的值
    if not second:
        second = first
        first = 0
    while first < second:
        yield first
        first += third

for i in my_range(9):
    print(i)
for i in my_range(1, 10):
    print(i)
for i in my_range(1, 20, 2):
    print(i)
	
如果是倒着取my_range(100, 50, -1)呢?
def my_range(first, second=None, third=1):
    if not second:
        second = first
        first = 0
    while first < second:  # 判断第一个数小于第二个数
        yield first
        first += third
    while first > second:  # 判断第一个数大于第二个数
        yield first
        first -= abs(third)  # 把负数转换为绝对值


for i in my_range(100, 50, -1):
    print(i)
for i in my_range(1, 10):
	print(i)
for i in my_range(1, 10, 2):
	print(i)

yield冷门用法

def eat(name):
    print('%s 准备干饭!!!'%name)
    while True:
        food = yield
        print('%s 正在吃 %s' % (name, food))
res = eat('jason')  # 并不会执行代码 而是转换成生成器
res.__next__()
res.send('面条')  # 通过send传值给yield赋值号左边的的变量名
res.send('盖浇饭')

yield与return对比

yield
	1.可以有返回值(支持多个并且组织成元组)
    2.函数体代码遇到yield不会结束而是'停住'
    3.yield可以将函数变成生成器 并且还支持外界传值
return
	1.可以返回值
    2.函数体代码遇到return直接结束

生成器表达式

# 就是生成器的简化写法
l1 = [i ** 2 for i in range(10)]
print(l1)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

l1 = (i ** 2 for i in range(10)) # 就是个生成器对象
print(l1)  # <generator object <genexpr> at 0x0000026509542DB0>
print(l1._next_()) # 0
print(l1._next_())  # 1
print(l1._next_())  # 4
for i in l1:
    print(i)  
print(list(l1))  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

笔试题

"""
面试题(有难度)
	大致知道流程即可
"""
def add(n, i):  # 普通函数 返回两个数的和  求和函数
    return n + i
def test():  # 生成器
    for i in range(4):   # 0 1 2 3
        yield i
g = test()  # 激活变成生成器
for n in [1, 10]:
    g = (add(n, i) for i in g)
# add(1, i) for i in test()
# add(10, i) for i in add(1, i) for i in test()
# for循环结束完n是10 add(10, i) for i in add(1o, i) for i in test()  test是0 1 2 3 到add(10, 0)
# add(10, 1) add(10, 2) add(10, 3)求和函数 add(10, i) for i in (10, 11, 12, 13) 再到求和函数中
    """
    第一次for循环
        g = (add(n, i) for i in g)
    第二次for循环
        g = (add(10, i) for i in (add(10, i) for i in g))
    """
res = list(g)  # for循环遍历列表接收值[20, 21, 22, 23]
print(res)

#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
#C. res=[20,21,22,23]
#D. res=[21,22,23,24]
答案:C
posted @   小福福  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
  1. 1 原来你也在这儿 温余福
  2. 2 世间美好和你环环扣扣 温余福
  3. 3 随风起舞 温余福
  4. 4 罪恶都市 温余福
罪恶都市 - 温余福
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 王星

作曲 : 灰鸿啊/皮皮

编曲 : 夏日入侵企画

制作人 : 邢硕

节奏吉他 : 肯尼

主音吉他 : 张伟楠

贝斯 : 皮皮

鼓 : 海鑫

和声 : 邢硕

音效制作 : 邢硕

录音 : 邢硕/夏国兴

混音 : 于昊

特别鸣谢 : 张伟楠

这城市的车流和这地表的颤抖

像一颗石子落入地心之后泛起的温柔

暗涌

河水流过转角她的楼

被梦魇

轻声呓语唤醒身后的幼兽

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都

已忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去陈旧的还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池已失守

最终无法占有

无眠辗转

伴着人间破碎的旧梦

像繁星

退却后只剩下混沌的夜空

炙热

掩盖风声鹤唳的担忧

把所有失落无助反手推入

无尽的白昼

失效感官焦灼只剩下

麻木愚钝无从感受

共同支撑全都瓦解

只是我们现在都已经忘记到底是

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

眼看这情节开始变旧

所有的城池早已失守

惶恐难以接受

缠绵往复不肯放手

最终无法占有

谁隐藏春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁 灭 即 拯 救

谁掠夺春秋

谁在大雨之后

把旗帜插在最高的楼

过去的陈旧还在坚守

内心已腐朽

摇摇欲坠不停退后

毁灭即拯救

夏日掠夺春秋

结局无法看透

明知城池已失守

缠绵往复不肯放手

最终无法占有

点击右上角即可分享
微信分享提示