异常捕获处理

1.异常
异常就是代码运行报错 行业术语叫bug
代码运行中一旦遇到异常会直接结束整个程序的运行 我们在编写代码的过程中要尽可能避免
2.异常分类
语法错误
不允许出现 一旦出现立刻改正 否则提桶跑路
逻辑错误
允许出现的 因为它 一眼发现不了 代码运行之才可能会出现
3.异常结构
错误位置
错误类型
错误详情

异常常见类型

SyntaxError
NameError
IndexError
KeyEroor
IndentationError
...

异常处理的语法结构

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 isinstance(name,int)
assert isinstance(name,str)
print('哈哈哈哈哈哈,大长腿')
name.strip()
2.主动抛异常
name = 'jason'
if name == 'jason':
raise Exception('俺老张不干了')
else:
print('正常走')

异常处理实战应用

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

生成器对象

1.本质
还是内置有__iter__和__next__的迭代器对象
2.区别
迭代器对象是解释器自动提供的
数据类型\文件对象>>>>:迭代器对象
生成器对象是程序员编写出来的
代码、关键字>>>:迭代器对象(生成器)
3.创建生成器的基本语法
函数体代码中填写yield关键字
# def my_iter():
# print('哈哈哈哈')
# yield
'''
1.函数体代码中如果有yield关键字
那么函数名加括号并不会执行函数体代码
会生成一个生成器对象(迭代器对象)
'''
# res = my_iter()
'''
2.使用加括号之后的结果调用__next__才会执行函数体代码
'''
# res.__next__()
'''
3.每次执行完__next__代码都会停在yiled位置下次基于该位置继续往下找第二个yieled
'''
def my_iter():
print('哈哈哈')
yield '呸呸呸'
print('嘿嘿嘿嘿嘿')
yield 222222
print('嘻嘻嘻嘻')
yield 333333
res = my_iter()
r1 = res.__next__()
print(r1)
r2 = res.__next__()
print(r2)
r3 = res.__next__()
print(r3)
'''
4.yield还有点类似于return 可以返回返回值
'''

课堂练习

自定义生成器对比range功能(一个参数 两个参数 三个参数 迭代器对象)
for i in range(1,10):
print(i)
1.先写两个参数的
2.再写一个参数的
3.最后写三个参数 # 1.生成器
# 两个参数
def my_range(start_num,end_num = None,step=1):
# 判断end_num是否有值 没有值说明用户只给了一个值 起始数字应该是0 终止位置应该是传的的值
if not end_num:
end_num = start_num
start_num = 0
while start_num < end_num:
yield start_num
start_num += step
# res = my_range(1,10).__iter__()
# while True:
# try:
# i = res.__next__() # for i in range(1,10):print(i)
# print(i)
# except StopAsyncIteration:
# break
# for i in my_range(100):
# print(i)
# for i in my_range(1,100):
# print(i)
# for i in my_range(10):
# print(i)
for i in my_range(100, 50, -1):
print(i)
# for i in range(100, 50, -1):
# 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('汉堡') # 1.将括号内的数据传给yield前面的变量名 2.再自动调用__next__
res.send('2222')
res.send('33333')

生成器表达式

就是生成器的简化写法
l1 = [i ** 2 for i in range(100)]
print(l1) l1 = (i ** 2 for i in range(100)) # 生成器对象
print(l1) # <generator object <genexpr> at 0x000001E249ED3C10>
for i in l1:
print(i) """
面试题(有难度)
大致知道流程即可
"""
def add(n, i): # 普通函数 返回两个数的和 求和函数
return n + i
def test(): # 生成器
for i in range(4):
yield i
g = test() # 激活生成器
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次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)
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]

python进阶之路15 之异常处理、生成器相关的更多相关文章

  1. Python进阶之路---1.4python数据类型-数字

    python入门基础 声明:以后python代码未注明情况下,默认使用python3.x版本 1.python代码基础:print     print('hello,python')   1.1pyt ...

  2. Python进阶之路---1.3python环境搭建

      python环境安装 windows python环境安装 下载安装包     https://www.python.org/downloads/ 安装并指定安装目录     C:\python2 ...

  3. Python进阶之路---1.2python版本差异

    Python2.*与python3.*版本差异 作为一个初学者,我们应该如何选择python的版本进行学习呢,这两个版本有什么区别呢,接下来让我们简单了解一下,以便我们后续的学习. Python版本差 ...

  4. Python修炼之路-装饰器、生成器、迭代器

    装饰器 本质:是函数,用来装饰其他函数,也就是为其他函数添加附加功能. 使用情景 1.不能修改被装饰的函数的源代码:        2.不能修改被装饰的函数的调用方式. 在这两种条件下,为函数添加附加 ...

  5. Python学习之路15☞socket编程

    一 客户端/服务器架构 即C/S架构,包括 1.硬件C/S架构(打印机) 2.软件C/S架构(web服务) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二 os ...

  6. Python进阶之路---1.5python数据类型-字符串

    字符串 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; ...

  7. python进阶之路之文件处理

    Python之文件处理 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  8. python进阶之路4.2---装饰器

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  9. python进阶之路4.1---生成器与迭代器

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  10. Python进阶之路---1.1python简介

                            Python简介 Python简介 Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释 ...

随机推荐

  1. 后端框架的学习----mybatis框架(7、使用注解开发)

    7.使用注解开发 1.注解在接口上实现 /** * 查询用户 */ @Select("select * from user") public List<User> ge ...

  2. 4.pytest结合allure-pytest插件生成allure测试报告

    之前我们使用的测试报告插件是pytest-html 这次使用的插件是allure-pytest,更加美观强大 安装插件 pip3 install allure-pytest 安装allure(Mac) ...

  3. C# 6.0 添加和增强的功能【基础篇】

    C# 6.0 是在 visual studio 2015 中引入的.此版本更多关注了语法的改进,让代码更简洁且更具可读性,使编程更有效率,而不是和前几个版本一样增加主导性的功能. 一.静态导入 我们都 ...

  4. 使用 nvm 对 node 进行版本管理

    前端项目工程化,基本都依赖于 nodejs, 不同的项目对于 nodejs 的版本会有要求,nvm 就是可以让我们在各个版本之间进行快速切换的工具. Linux 系统 下载解压 查看所有版本 , 选择 ...

  5. 虚拟机里网络连接的几种方式说明(桥接,NAT, 仅主机)

    虚拟机里网络连接类型的选择: 桥接:选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系,相当于连接在同一交换机上. NAT:NAT模式就是虚拟机要联网得先通过宿主机才能和外面进行通信. 仅主机:虚拟 ...

  6. 三十五、kubernetes NameSpace介绍

    Kubernetes NameSpace 介绍 Kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制.无论是 ...

  7. Linux之Docker-01

    一.镜像基础命令 1.docker version  [root@DY-Ubuntu-01 ~]#docker version               #查看 Docker 版本 2.docker ...

  8. 论文笔记 - PRISM: A Rich Class of Parameterized Submodular Information Measures for Guided Subset Selection

    Motivation 与 Active Learning 类似,Target Learning 致力于 挑选外卖更"感兴趣"的数据,即人为为更重要的数据添加 bias.例如我们当前 ...

  9. python枚举类型 Enum

    在python中枚举是一种类(Enum) 枚举类中不能存在相同的标签名 枚举是可迭代的 例: from enum import Enum class Vip(Enum): MONDAY = 0 TUE ...

  10. 我要涨知识 —— TypeScript 常见面试题(一)

    1.ts 中的 any 和 unknown 有什么区别? unknown 和 any 的主要区别是 unknown 类型会更加严格:在对 unknown 类型的值执行大多数操作之前,我们必须进行某种形 ...