可迭代对象与迭代器
迭代
迭代其实就是更新换代,也就是将每次执行的结果作为下次执行的初始值,也就是必须依赖于上次执行的结果
# 单纯的循环并不是迭代
i = 0
while True:
print(i)
# 每次迭代都必须基于上次的执行结果
i = 0
while True:
if i <= 10:
print(i)
i += 1
else:
print('活干完了,老小子!!!')
break
迭代取值
这里用while循环模拟对字符串的迭代取值
tuple1 = (1, 2, 3, 4, 5, 6)
n = 0
while n < len(tuple1):
print(str1[n])
n += 1
可迭代对象
'''
1. 可迭代对象的特征
内置有__iter__方法的都是可迭代对象
2. 可迭代对象的数据类型
字符串、列表、字典、元组、集合、文件
其实可迭代对象就是支持迭代取值的类型,提供了不依赖与索引取值的取值方式
'''
迭代器对象
'''
1. 可迭代对象调用__iter__方法之后的结果就是迭代器对象
2. 迭代器对象同时含有 __iter__和__next__方法的数据
3. 迭代器对象能够节省存储空间,不需要的时候不会迭代,需要的时候可以迭代出很多数据
4. 用__next__方法进行取值(取值结束会报错)
5. 有了迭代器对象以后才有针对字典和集合的迭代取值操作
补充:
1. 双下加方法名一般都有两种写法,但是并不是所有都是
2. 有些可迭代对象本身就是迭代器对象:文件
3. 可迭代对象多次调用__iter__方法之后的结果还是迭代器对象(只有第一次调用有作用)
4. 迭代取值:
(1)可迭代对象
str1 = 'oliver'
可迭代对象的多次迭代取值相当于每次都产生一个新的对象再迭代
print(str1.__iter__().__next__()) # o 每次先产生一个新的迭代器对象然后取值
print(str1.__iter__().__next__()) # o 每次先产生一个新的迭代器对象然后取值
print(str1.__iter__().__next__()) # o 每次先产生一个新的迭代器对象然后取值
print(str1.__iter__().__next__()) # o 每次先产生一个新的迭代器对象然后取值
(2)迭代器对象
迭代器对象的多次迭代取值是对同一个对象进行多次迭代
res = str1.__iter__() # 已经变成迭代器对象了
print(res.__iter__().__next__()) # o 之后再调用还是自身
print(res.__iter__().__next__()) # l
print(res.__iter__().__next__()) # i
print(res.__iter__().__next__()) # v
'''
for循环原理
# for循环的while实现
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = l1.__iter__()
n = 0
while n < len(l1):
print(res.__next__())
n += 1
# for循环的底层步骤
'''
for i in 可迭代对象:
循环体
步骤:
1. 先将可迭代对象调用__iter__()变成迭代器对象
for循环取值多次调用同一对象的原因
2. 针对可迭代对象调用__next__()迭代取值
for循环每次取值都取下一位的原因
3. 当迭代器对象内的值取完,报错结束循环
'''
# for循的迭代器实现
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
res = l1.__iter__()
while True:
print(res.__next__())
异常处理
'''
1. 异常的定义
代码运行过程中出现错误就是代码异常,出现异常会导致代码直接终止
2. 异常信息的介绍
(1) line n 所在的一行说明异常出现在第n行,并且line关键字前面的蓝色字体可以直接定位错误位置
(2) ……Error是指异常类型
(3) ……Error冒号后跟的是异常原因
3. 异常的分类
(1)语法异常:低级错误不被允许,出现立刻改正
基本的结构错误
(2)逻辑异常:被允许,不过要尽量避免,出现尽快修改
eg:字符串调取其他类型的内置方法
4. 异常的类型
(1)变量名异常 NameError
(2)索引异常 IndexError
(3)键异常 KeyError
(4)值异常 ValueError
………………………………………………………………
'''
异常处理语法结构
'''
1. 异常处理就是针对可能出现的错误,用一定的方法避免异常导致程序终止
基本语法结构
try:
可能异常的代码
except 异常类型A as a: # a是出该类型错误的提示信息
处理异常A的措施
except 异常类型B as b:
处理异常B的措施
except 异常类型C as c:
处理异常C的措施
2. 万能语法结构
try:
可能异常的代码
except Exception as e: # Exception可以接受所有的异常类型
处理所有异常的措施
3. 使用异常处理的准则
1. 异常处理检测的代码越少越好
2. 异常处理的使用次数越少越好
4. 异常处理(了解内容)
(1) try + else
被try检测代码没有异常,正常执行完执行else的子代码
try:
可能异常的代码
except Exception as e: # Exception可以接受所有的异常类型
处理所有异常的措施
else:
不出错之后执行的子代码
(2) try + finally
无论被检测代码是否出错,最后都会执行finally的子代码
try:
可能异常的代码
except Exception as e: # Exception可以接受所有的异常类型
处理所有异常的措施
finally:
无论被检测代码是否异常,最后都执行的子代码
(3) try + else + finally
try:
可能异常的代码
except Exception as e: # Exception可以接受所有的异常类型
处理所有异常的措施
else:
不出错之后执行的子代码
finally:
无论被检测代码是否异常,最后都执行的子代码
(4) 断言
name = 'jason'
assert isinstance(name,str)
(5) 主动报错
raise 报错类型(错误内容)
raise NameError('不爽 就要作!!!')
'''
for循环底层结构
str1 = 'oliver'
# 1. 先把可迭代对象变成迭代器对象
res = str1.__iter__()
res = iter(str1)
# 2. 迭代取值
while True:
try: # 检测代码是否异常
print(res.__next__())
except Exception as wrong:
break # 接收到异常直接终止循环运行,执行结束
索引取值与迭代取值
'''
1. 索引取值
优点:可以反复取相同的元素,取值可以倒退,随意间隔
缺点:只支持列表等有序数据类型,兼容性较低
2. 迭代取值
优点:支持所有的容器类型数据,兼容性好
缺点:取值顺序和方向固定,无法重复取值
3. 迭代器取值
迭代器取值时迭代器里的数据取一个少一个,取完就空了
'''