迭代器和异常捕捉
可迭代对象
可迭代对象有:
字符串、列表、元组、字典、集合等,文件也是可迭代对象
整型、浮点型、布尔值都不是
迭代器对象
迭代器对象有: str、list、dict、tuple、set、文件等
1.迭代器
迭代器就是一种不依靠于索引取值的方式
一次调用可供持续取值,重新调用则会重置
1 l1 = [11, 33, 44, 5, 66] 2 res = l1.__iter__() 3 print(res.__next__()) # 11 4 print(res.__next__()) # 33 5 print(l1.__iter__().__next__()) # 11
异常捕获
异常就是错误发生的信号,如果不对此信号做正确处理,那么程序之后就不能正常运行
1.异常的分类
1.Traceback
是异常位置所在处,可以直接定位到异常发生的位置
2.XXXError
错误的类型
3.XXXError后面的详细信息
错误的描述,一般我们直接看错误的详细信息都可以定位原因
4.异常的类型
1.语法错误:坚决不允许,容易解决,借助于pycharm工具就可以很容易的定位到
2.逻辑错误:是允许出现的,但是我们在写代码的时候,尽量的避免逻辑错误
2.XXXError(类型)
1.NameError 变量名错误
2.IndexError 索引错误
3.KeyError 取值错误
4.ZeroDivisionError
3.解决错误
预测可能出现的错误提前让代码继续运行下去
语法结构:
try:
被检测的代码:一般是可能会发生的错误
except 错误类型 as e:
发生这种类型需要执行的
except Exception as e: # 所有错误都执行
发生所有错误类型都执行的
else:
没有错误需执行的 # 不可单独和try使用
finally:
不管什么情况都执行的
4.断言
代码走到这一行,条件必须成立,如果不成立,下面的代码都不能走,直接就报错
assert 条件
测试题(不靠for打印列表内容)
方法一:
用while循环
1 l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 2 res = l.__iter__() 3 while True: 4 try: 5 print(res.__next__()) # 打印列表所有值 6 except Exception: # 直到读取完报错时,跳出循环结束读取 7 break
方法二:
用递归函数
1 l = [1, 2, 3, 4, 5, 6] 2 3 res = l.__iter__() 4 def a(x): 5 try: 6 print(x.__next__()) 7 except StopIteration: 8 return 9 a(x)
方法三:
娱乐一下用pop
1 l = [1, 2, 3, 4, 5, 6] 2 3 res = l.__iter__() 4 5 def b(x): 6 if len(x) == 0: 7 return 8 print(x.pop(0)) 9 b(x) 10 11 b(l)
迭代取值和索引取值的对比
1.迭代取值
1.不依赖于索引取值
2.只能从左往右依次取值,不能重复取值
2.索引取值
1.必须依赖于索引取值
2.可以重复取值
3.必须是容器类型