首页 > 其他分享 >异常捕捉/生成器

异常捕捉/生成器

时间:2022-10-17 19:59:18浏览次数:49  
标签:__ .__ res 生成器 next 捕捉 print 异常

异常常见类型

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

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

相关文章

  • 异常和生成式
    异常常见类型AssertionError 断言语句失败(assert后的条件为假)AttributeError 访问的对象属性不存在lmportError 无法导入模块或者对象,主要是路径有误或名称错误ln......
  • 异常处理、生成器对象、生成器表达式
    异常处理、生成器对象、生成器表达式目录异常处理、生成器对象、生成器表达式一、异常常见类型二、异常处理语法结构三、异常处理的补充四、异常处理的实战应用五、生成器......
  • 异常补充与生成器
    异常常见类型SyntaxErrorNameErrorIndexErrorKeyErrorIndentationError异常处理语法结构1.基本语法结构 try:待监测的代码(可能会出错的代码)excep......
  • 异常处理与生成器
    今日内容总结目录今日内容总结异常常见类型异常处理语法结构异常处理补充异常处理实战应用生成器对象yield冷门用法生成器表达式练习题异常常见类型SyntaxError 语法......
  • 异常常见类型、异常处理语法、补充、实战、生成器对象、表达式
    目录异常常见类型异常处理语法结构异常处理补充异常处理实战应用生成器生成器对象生成器函数生成器练习题yield其他用法生成器表达式异常常见类型SyntaxError:Python语......
  • 异常处理和生成器对象
    目录一.异常常见类型二.异常处理语法结构1.基本语法结构2.查看错误信息3.针对不同的错误类型定制不同的解决方案4.万能异常Exception/BaseException5.结合else使用6.结合f......
  • 解决 Error creating bean with name 'UserMapper' defined in file异常处理和Cause:
    Errorcreatingbeanwithname'UserMapper'definedinfile异常处理和Cause:java.lang.IllegalArgumentException:ResultMapscollectionalreadycontains这两个问......
  • 异常、生成器
    异常、生成器异常常见类型异常以不同的类型出现,这些类型都作为信息的一部分打印出来:例子中的类型有SyntaxErrorNameErrorIndexErrorKeyErrorIndentationError......
  • 异常处理与生成器
    异常处理与生成器异常处理异常处理语法结构1.基本语法结构try:待监测的代码(感觉要BBQ的代码)except错误类型:针对上述错误制定的方案......
  • MySQL 5.7.39 group by查询异常
    一、异常摘要Errorqueryingdatabase.Cause:java.sql.SQLSyntaxErrorException:Expression#1ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregated......