今日内容详细
异常常见类型
| AttributeError |
| ImportError |
| SyntaxError |
| NameError |
| IndexError |
| KeyError |
| IndentationError |
| IOError |
| OverflowError |
| TabError |
| TypeError |
| ValueError |
| |
| ZeroDivisionError |
| ....... |
异常处理语法结构
| 1.基本语法结构: |
| try: |
| 待检测的代码(可能会出错的代码) |
| except 错误类型: |
| 针对上述错误类型制定的方案 |
| 2.查看错误的信息 |
| try: |
| 待检测的代码(可能会出错的代码) |
| except 错误类型 as e: |
| |
| 针对上述错误类型制定的方案 |
| 3.针对不同的错误类型定制不同的解决方案 |
| try: |
| 待检测的代码(可能会出错的代码) |
| except 错误类型 as e: |
| |
| try: |
| 待检测的代码(可能会出错的代码) |
| except 错误类型 as e: |
| |
| try: |
| 待检测的代码(可能会出错的代码) |
| except 错误类型 as e: |
| |
| ... |
| |
| 4.万能异常 Exception/BaseException |
| try: |
| 待监测的代码(可能会出错的代码) |
| except Exception as e: |
| 针对各种常见的错误类型全部统一处理 |
| 5.结合else使用 |
| try: |
| 待监测的代码(可能会出错的代码) |
| except Exception as e: |
| 针对各种常见的错误类型全部统一处理 |
| else: |
| try的子代码正常运行结束没有任何的报错后 再执行else子代码 |
| |
| 6.结合finally使用 |
| try: |
| 待监测的代码(可能会出错的代码) |
| except Exception as e: |
| 针对各种常见的错误类型全部统一处理 |
| else: |
| try的子代码正常运行结束没有任何的报错后 再执行else子代码 |
| finally: |
| 无论try的子代码是否报错 最后都要执行finally子代码 |
异常处理补充
| 1.断言 |
| def zero(s): |
| a = int(s) |
| assert a > 0 |
| print(a) |
| return a |
| zero('-5') |
| assert a>0 判断为True,所以可以继续执行下面的程序。 |
| assert a<0 判断为False,所以报错AssertionError,程序中断。 |
| |
| 2.主动抛异常 |
| name = 'jason' |
| if name == 'jason' |
| raise Exception('fuck off') |
| else: |
| print('正常执行') |
异常处理实战应用
| 1.异常处理能尽量少用就少用 |
| 2.被try监测的代码能尽量少就尽量少 |
| 3.当代码中可能会出现一些无法控制的情况报错才应该考虑使用 |
| 手机访问网络软件 断网 |
| 编写网络爬虫程序请求数据 断网 |
| |
| 课堂练习 |
| 使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能 |
| l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99] |
| |
| list_l1 = l1.__iter__() |
| |
| while True: |
| try: |
| print(list_l1.__next__()) |
| except StopIteration as e: |
| break |
生成器对象
| 1. 定义阶段就是一个普通函数 |
| 2.当函数体内含有yield关键字,那么在第一次调用函数的时候,并不会执行函数体代码,而是将函数变成了生成器(迭代器) |
| 1.本质 |
| 还是内置有__iter__和__next__的迭代器对象 |
| 2.区别 |
| 迭代器对象是解释器自动提供的 |
| 数据类型\文件对象>>>:迭代器对象 |
| 生成器对象是程序员编写出来的 |
| 代码、关键字>>>:迭代器对象(生成器) |
| 3.创建生成器的基本语法 |
| 函数体代码中填写yield关键字 |
| def my_iter(): |
| print('good good') |
| yield |
| """ |
| 1.函数体代码中如果有yield关键字 |
| 那么函数名加括号并不会执行函数体代码 |
| 会生成一个生成器对象(迭代器对象) |
| """ |
| res = my_iter() |
| '''2.使用加括号可之后的结果调用__next__才会执行函数体代码''' |
| res.__next__() |
| '''3.每次执行完__next__代码都会停在yield位置 下次基于该位置继续往下找第二个yield''' |
| def my_iter() |
| print('123456789') |
| yield 111, 222, 333 |
| print('魏某z最帅') |
| yield 222,333,444 |
| print('努力') |
| yield 222,333,444 |
| print('冲') |
| yield 222, 333, 444 |
| 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 可以返回返回值''' |
| |
课堂练习
| 自定义生成器对标range功能(一个参数 两个参数 三个参数 迭代器对象) |
| |
| def my_range(start_num, end_num): |
| while start_num < end_num: |
| yield start_num |
| start_num += 1 |
| |
| |
| res = my_range(1, 10).__iter__() |
| while True: |
| try: |
| i = res.__next__() |
| print(i) |
| except StopIteration: |
| break |
| |
| 2.(一个参数) |
| def my_range(start_num, end_num=0): |
| if end_num == 0: |
| end_num = start_num |
| start_num = 0 |
| while start_num < end_num: |
| yield start_num |
| start_num += 1 |
| |
| |
| for i in my_range(10): |
| print(i) |
| |
| 3.(3个参数) |
| def my_range(start_num, end_num=0,step=1): |
| if end_num == 0: |
| end_num = start_num |
| start_num = 0 |
| while start_num < end_num: |
| yield start_num |
| start_num += step |
| |
| |
| for i in my_range(1, 10, 2): |
| print(i) |
| |
yield冷门用法
| def eat(name, food=None): |
| print(f'{name}准备用餐') |
| while True: |
| food = yield |
| print(f'{name}正在吃{food}') |
| |
| res = eat('jason') |
| res.__next__() |
| |
| |
| res.send('包子') |
| res.send('面条') |
生成器表达式
| |
| l1 = [i ** 2 for i in range(100)] |
| print(l1) |
| |
| l1 = (i ** 2 for i in range(100)) |
| print(l1) |
| for i in l1: |
| print(i) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构