ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

bug与生成器

2022-07-12 20:05:04  阅读:260  来源: 互联网

标签:__ aa run res 生成器 next print bug


异常捕捉

异常

  • 程序在运行的时候异常会导致程序结束,也就是俗称的bug
  • 异常结构
aa
print(aa)

Traceback (most recent call last):
  File "D:/PY01/00截图用.py", line 1, in <module>
    aa
NameError: name 'aa' is not defined

1.点击 "D:/PY01/00截图用.py"这种有文件路径的会跳到异常代码处
2.line 后面的数字是提示哪一行代码出错了
3.最后一行冒号左侧是异常类型
4.最后一行冒号右侧是异常具体原因
  • 异常类型
1.异常的类型
aa
print(aa)		    NameError()  使用没有绑定任何数据的变量名

aa = [1, 2]
print(aa[2])	    IndexError()  索引超出列表数据值范围

aa = {'a': 1}
print(aa['b'])	    KeyError()  查找不存在关键字

SyntaxError
a = 'barry'
a += 1			   TypeError()  不同类型类型的无效操作

for i in:
    print(i)	  SyntaxError()  语法错误

2.异常分类
语法错误:是不允许出现的,因为这是一种非常低级的错误,会让人觉得你的水平很烂
for i in:
    print(i)
逻辑错误:逻辑错误就是你代码语法符合规范但运行时就是出问题或报错,逻辑错误是允许出现的,出错后修改即可

img

异常捕捉

  • 异常捕捉就是给可能出现的问题提前给出处理措施
  • 异常捕捉的语法结构
try:
    被try监视的可能会出错的代码
except 错误类型 as e:
    出问题后的处理措施
如:
try:
    aaa  # 被try监视的可能会出错的代码
except NameError as e:  # 没有绑定任何数据的变量名
    print('变量名没有绑定任何数据')  # run:变量名没有绑定任何数据
except IndexError as e:  # 另一种错误可能
    print('索引超出列表数据值范围')  # 出问题后的处理措施
  • 万能异常处理
try:
    aa = [1, 2]
    print(aa[2])
except Exception as e:  # 万能处理方式1:Exception
    print(e)  # 打印具体的错误原因
except BaseException as e:  # 万能处理方式2:BaseException
    print(e)  # run:list index out of range
try:
    aa = [1, 2]
    print(aa[2])
except Exception as e:
    print(e)
else:
    print('try监测的代码没有出错正常结束会执行else子代码')
finally:
    print('try监测的代码有没有出错都会执行finally子代码')
  • 断言

    数据类型不是断言的类型就报错

name = 'barry'
assert isinstance(name, dict)  # 数据类型不对则直接报错
print('如果name不是字典则报错')  # run报错了
  • 主动抛异常

    判断为True则报错

hhh = input('乌林之西,宜都之北>>>').strip()
if hhh == '笑周瑜无谋,诸葛亮少智':
    raise Exception('曹贼休走,赵云在此等候多时了')
else:
    print('溜了溜了')
  • 异常捕获能少用就少用,被try监测的代码能少就少
img

自定义迭代对象

生成器对象

  • 当函数体代码中有yield关键字,那么就由函数变成了迭代器(生成器)对象
def index():
    print('来了 老弟')
    yield 110
    print('又来了 老弟')
    yield 120
    print('你可别来了')
    yield 119
"""
函数名第一次加括号调用不会执行函数体代码
yield可以在函数体代码中出现多次
执行__next__方法时会从上往下到yield处停留,再次执行__next__方法时从停留的yield开始
"""
index()
print(index)  # run:<function index at 0x000001FB00DE61F0>
res = index()
print(res)  # run:<generator object index at 0x0000029E84A06A50>
res.__next__()  # run:来了 老弟
res.__next__()  # run:又来了 老弟
res.__next__()  # run:你可别来了

"""
yield后面有数据值的话,数据值会像返回值一样返回回去
yield后面的数据值有多个且用逗号隔开,就会组成元组返回
"""

print(res.__next__())
# run:来了 老弟     (110, 911)
print(res.__next__())
# run:又来了 老弟    120
print(res.__next__())
# run:你可别来了     119

yield的用法

def func(name, crime=None):
    print(f'{name}被抓了')
    while True:
        crime = yield
        print(f'{name}犯了{crime}罪')


res = func('张三')
res.__next__()
res.send('非法入侵住宅')  # 传值并调用__next__方法
res.send('盗窃')
res.send('故意伤害')
# run:
# 张三被抓了
# 张三犯了非法入侵住宅罪
# 张三犯了盗窃罪
# 张三犯了故意伤害罪
img

生成器表达式

  • 生成器表达式
1.列表生成器
res = [i for i in range(10) if i < 5]
print(res)  # run:[0, 1, 2, 3, 4]

2.生成器表达式
res = (i for i in range(10) if i < 5)
print(res.__next__())  # run:0
print(res.__next__())  # run:1
print(res.__next__())  # run:2
print(res.__next__())  # run:3
print(res.__next__())  # run:4

面试题

def add(n, i):  # 普通函数 返回两个数的和  求和函数
    return n + i
def func():
    for i in range(4):
        yield i
a = func()
for n in [1, 10]:
    a = (add(n, i) for i in a)
"""
第一次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(a)
print(res)
# c
# A. res=[10,11,12,13]
# B. res=[11,12,13,14]
# C. res=[20,21,22,23]
# D. res=[21,22,23,24]

标签:__,aa,run,res,生成器,next,print,bug
来源: https://www.cnblogs.com/riuqi/p/16471444.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有