异常捕获,生成器对象

异常常见类型

SyntaxError  》》语法错误
NameError》》名称错误
IndexError》》索引错误
KeyError》》字典键错误
IndentationError》》缩进错误

异常处理语法结构

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

异常处理实战应用

1.异常处理能尽量少用就少用

2.被try检测的代码能尽量少就尽量少

3.当代码中可能会出现一些无法控制的 情况报错才应该考虑使用

eg:使用手机访问网络软件 断网

编写网络爬虫程序请求数据断网

课堂练习:
"""使用while循环+异常处理+迭代器对象  完成for循环迭代取值的功能"""
 l1 = [11,22,33,44,55,66,77,88,99,100]
iter_l1 =l1.__iter__()  #1.先把列表转换成迭代器对象
while True:# 2.用while 循环让迭代器对象反复执行__next__(双下next)
    try:
        print(iter_l1.__next__()) # 用双下next循环取出值 
    except StopAsyncIteration as e :
        break# 停止循环

生成器对象

1.本质
内置有__iter__和__next__的迭代器对象
2.区别
迭代器对象是解释器自动提供的
	数据类型/文件对象》》:迭代器对象(生成器)
3.创建生成器的基本语法
函数体代码中填写yield关键字
def my_iter():
    print('haha')
    yield
     # def my_iter():
    #     print('哈哈哈 椰子汁很好喝')
    #     yield
    '''1.函数体代码中如果有yield关键字 
        那么函数名加括号并不会执行函数体代码
        会生成一个生成器对象(迭代器对象)
    '''
  res = my_iter()
    '''2.使用加括号之后的结果调用__next__才会执行函数体代码'''
     res.__next__()
    '''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield'''
    def my_iter():
        print('哈哈哈 ')
        yield 111, 222, 333
        print('呵呵呵 ')
        yield 111, 222, 333
        print('嘿嘿嘿 ')
        yield 111, 222, 333
        print('哼哼哼')
        yield 111, 222, 333
    res = my_iter()
    r1 = res.__next__()
    print(r1)
    r2 = res.__next__()
    print(r2)
    r3 = res.__next__()
    print(r3)
    r4 = res.__next__()
    print(r4)
   4.yield还有点类似于return 可以返回返回值

yield 冷门用法

  def eat (name, food = None):
        print(f'{name}进行准备
     whlie True:
        food = yield
        print(f'{name}开始}
              
res = eat('jason')
res.__next__()

生成器表达式

生成器表达式就是生成器的简化写法!主要就是为了节省内存

#列表生成式:
l1=[i for i in range(5)]
print(l1) #结果为:[0,1,2,3,4]

#生成器表达式(没有元组生成式)
l1=(i for i in range(5))
print(l1) #结果为:<generator object <genexpr> at 0x000002CECB2BE120>
#print(l1.__next__()) #结果为:0
#print(l1.__next__()) #结果为:1  需打印调用多次才可以取完
for i in l1:
    print(i) #结果为:把0~4循环打印出来

posted @   梅梅小可爱  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示