异常常见类型
SyntaxError - 语法错误
NameError - 变量名类型错误
IndexError - 索引错误
KeyError - 字典键错误
IndentationError - 缩进错误
#注意我们最不允许犯的错误就是语法错误哦
异常处理方法
1,我们可以使用异常处理语法,让可能发生异常的代码 不报错 并有反馈
代码展示:
关键词 try except
try:
可能有问题的代码
except 错误类型:
如果犯了这个错误反馈什么
try:
name = name + 1
except NameError :
print('这里有问题') #这里有问题
2.如何返回错误提示
try:
name = name + 1
except NameError as e: #使用临时变量e来接收这个错误说明
print(e) #在打印出来
3.万能的错误类型
关键词 Exception
try:
name = name + 1
except Exception : #所有错误类型
print('这里有问题') #针对任何错误类型的反馈
4.可能会报错,但没有报错格式
try:
name = name + 1
except Exception :
print('这里有问题')
else:
print('代码没问题哦')
#try 也可以配合else使用
5,finally
try:
可能出错的代码
except Exception:
出错后执行
else:
没出错时执行
finally:
无论是否出错 当上面代码执行都会执行
异常处理补充
1.断言 提前预测
关键词 assert
list1 = [1,2,3]
assert isinstance(list1,list) # 如果 变量 为 列表 则正常执行下面的代码
print('哈哈哈')
assert isinstance(list1,int) # 如果判断错误 则直接报错
2.主动抛异常
关键词 raise
list1 = [1,2,3]
if list1[0] == 1:
raise Exception('直接终止程序吧') # 条件达到执行这行代码 直接报异常
else:
print('没事')
异常处理的实际运用
1,异常处理能少用就少用,尽量避免写出有异常的代码
2. 被try检测 try里面的子代码尽量少一点,因为多了会影响内存哦
3. 保持只有尽量当代码中出现不可避免的异常时才使用 异常处理代码 try except
举例:使用手机访问网络软件 断网
编写网络爬虫程序请求数据 断网
小练习:
使用while循环+异常处理+迭代器对象 完成for循环迭代取值的功能
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
l1 = l1.__iter__() #把列表转换为一个生成器
while True:
try:
print(l1.__next__()) #循环对生成器 取值
except Exception: #直到报错
pass
生成器对象
1,什么是生成器对象?
本质还是内置有__iter__和__next__的迭代器对象
2. 区别
迭代器对象是python解释器自动提供的
字符串 列表 字典 元组 集合 和文件 都是已经被python设置成了可迭代对象
生成器对象 其实就是程序员通过编写 产生出来的
代码 + 关键字 :迭代器对象(也就是生产器)
3.创建生成器的基本语法机构
关键字 yield
def my_iter():
print('把我变成生成器')
yield
# 当函数题代码中有 yield 关键字 那么函数加上()并不会执行该函数,还是把函数变成了生成器对象(可迭代对象)
my_iter().__next__()
# 这样才算调用了一次函数题代码
# 每次执行完__next__() 代码都会停在yield的位置
4.yield
关键词后面可以跟反馈值
def my_iter():
print('把我变成生成器')
yield 1
print('把我变成生成器2')
yield 2
res = my_iter() # 必须要有一个变量去接受,不可以直接my_iter().__next__()
# 因为my_iter()执行后其实是得到了一个生成器 对这个生成器做__next__()才可以
print(res.__next__()) # 把我变成生成器 1
print(res.__next__()) # 把我变成生成器2 2
小练习
自定义生成器对标range功能(一个参数 两个参数 三个参数 迭代器对象)
for i in range(1,10):
print(i)
def my_range(start_num, end_num=None, step=1):
if not end_num: #判断 end_num用户是否有输入值 如果没有
end_num = start_num # 那就说明一个数字,那输入的数字就是结束值
start_num = 0 # 再把起始值设置为0
while start_num < end_num:
yield start_num
start_num += step # step是决定步长,默认为1 如果用户输入2 那这里就是没循环一次 就加2
for i in my_range(1,10,1):
print(i)
for循环就是利用这个 yield方法去不断取值,然后通过异常处理,当取到最后没有值得之后做异常处理
res = my_range(1,5).__iter__() # 先用一个变量名 赋值 给他生成器
while True:
try:
i = res.__next__() #然后不断.__next__()取值
print(i)
except Exception: #直到出现报错 结束循环
break
yield冷门
def eat(name,food=None):
print(f'{name}准备用餐')
while True:
food = yield
print(f'{name}正在吃{food}')
res = eat('moon')
res.__next__()
res.send('汉堡')
res.send('可乐') #send将括号内的数据传给yield前面的变量名 2.再自动调用__next__
res.__next__()
生成器表达式
l1 = [i ** 2 for i in range(5)]
print(l1)
l1 = (i ** 2 for i in range(5)) # 加小括号就相当于变成了生成器
print(l1.__next__())
print(l1.__next__())
print(l1.__next__())
"""
面试题(有难度)
大致知道流程即可
"""
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循环后 n只会等于for循环结束后的值 也就是10
"""
第一次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]
'''不用深入研究 大致知道起始数即可'''
标签:__,.__,res,生成器,next,捕捉,print,异常
From: https://www.cnblogs.com/moongodnnn/p/16800366.html