异常捕捉/生成器

异常常见类型

SyntaxError  - 语法错误
NameError - 变量名类型错误
IndexError - 索引错误
KeyError - 字典键错误
IndentationError  - 缩进错误

#注意我们最不允许犯的错误就是语法错误哦

image

异常处理方法

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使用   

5finally
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]
'''不用深入研究 大致知道起始数即可'''
posted @   Python-moon  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示