7/12课上内容整理

172 阅读3分钟

异常捕获

* 异常就是程序在运行过程中如果出现了异常会导致整个程序的结束
异常的显示为:
    Traceback (most recent call last):
      File "D:/Users/余其兵/6/day7/day712/作业.py",
     line 1, in <module>
          safaas
    NameError: name 'safaas' is not defined
  • 关键字line所在行就是提醒哪一行代码出错
  • 在最后一行冒号左侧是错误的类型,在冒号右侧是从无的具体原因也是报错的关键

异常的分类

  • 语法的错误:这个是不允许出现的 一旦出现就请立刻修改。
  • 逻辑的错误:是允许出现的 但是出现之后要去修改。

异常捕获实参演练

  • 当代码不确定什么时候会报错的情况下需要自己写代码异常处理。
  • 异常捕获的使用相当于是提前预测可能出现的问题并给出处理的措施。

异常捕获的代码实现

* 基本语法结构
try:
    可能会出错的代码(这里是会被try监控的)
except  错误的类型 +as +e:‘e是具体错误的原因’ 
可以往下持续很多次监控
* 万能异常(非常笼统的处理方式)
try:
    name
    d={‘name’:‘jerry’}
    d[‘pwd’]
    123+‘hello’
 except Exception as e:
     print(e)这是万能异常的一种方式相当于儿子
 except BaseException as e:
       print(e)这是万能异常的第二种方式相当于老子

异常捕获其他操作补充

* elsefinally
try:
   name
except Exception as e:
   print(‘小趴菜 报错了’)
else:
   priunt(在上一层没有出错并正常运行的情况下则会执行else子代码)
finaly:
    print(‘前两次都没有出错并正常运行的情况下则会执行finally子代码’)
* 断言 
name=‘jerry’
assert isinstance(name,list)
使用isinstance进行判断数据属于哪种类型  如果不对则直接报错  对的情况下则执行下面的代码
    print(‘针对name数据使用列表相关的操作’)
* 主动抛异常
 name=input(‘username>>>:’).strip()
 if name=='bandit':
   raise NameError(‘土匪进村了快跑’)
   raise Execption(‘来了就枪毙 不给过’)
 elseprint(‘不是土匪就没事’)
  将问题主动暴露出来利用异常捕获的方式进行让错误的代码变成对的。

异常捕获能少用就少用 同时被try监控的代码能少就少

异常捕获练习

* for循环内部的本质
* 需求使用while+异常捕获实现for循环的功能
 l1=[11, 22, 33, 44, 55, 66, 77, 88]
  res=l1.__iter__()
  while True:
      try:
       print(res.__next__())
  except Exception as e:
       break

生成器对象

* 本质其实就是迭代器对象;只不过迭代器是解释器提供给我们的相当于现成可以直接使用的;但是生成器却不是,需要我们自己动手敲出来。
* 我们学习生成器的目的是为了优化代码,一种不依赖与索引取值的通用方式更主要的是可以节省数据类型的内存占用空间。
* 生成器对象代码实现
def index():
    print(‘我很能喝’)
    yield  789654321
    print(‘过来一起喝啊  小趴菜 ’)
    yield 123
    print(‘喝不了不要和我一桌 去小孩那桌’)
    yield 963

当函数体代码中有yield关键 函数名第一次加括号调用不会执行函数体代码 而是由普通的函数变成了迭代器(生成器)返回值

* printindex)
 <function index at 0x000001F499F7A5E0>
 res=index()
 print(res)
 <generator object index at 0x0000021E18BACA50>
res.__next__()
res.__next__() 
res.__next__()

yield 可以在函数整体代码中出现很多次,每次调用__next__方法都会从上往下依次执行直到遇到了yield代码停下不走

print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
当yield后面有数据值就会想return一样返回  如果是多个数据值逗号隔开 结果会自动组成元组返回

yeild其他的用法

def index(name,food=Noneprint(f‘{name}准备喝酒’)
   while True:
       food=yield
       print(f'{name}正在喝{food}')
res=index('jerry')
res.__next__()
res.send(‘啤酒’)
res.send(‘红酒’)
res.send(‘白酒’)
这里调用了.send传值 它自动调用了__next__方法