python3 迭代器协议和for循环工作机制

什么叫迭代?

迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值(迭代只能往后走不能往前退)

for循环的本质:循环所有对象,全部都是使用迭代器协议
可迭代对象:实现了迭代器协议的对象,可迭代对象都有next方法

字符串,列表,元组,字典,集合,文件对象这些都不是可迭代对象,只不过for循环时,调用了他们内部的_iter_方法把他们变成了可迭代对象
然后for循环调用可迭代对象的_next_方法去取值
如何把对象变成可迭代对象?

li=[1,2,3,4]
a=li.__iter__()
print(a.__next__())


for循环也是一样的道理,相当于先把对象变成可迭代对象,然后再迭代

li=[1,2,3,4]
for i in li: #相当于i=li.__iter__()
    print(i ) #相当于print(a.__next__())


如何只用索引的方法遍历列表?

li=[1,2,3,4]
index=0
while index <len(li):
    print(li[index])
    index+=1

但是如果碰到了非序列类型,就无法这样处理了(字典,集合,文件)
for 循环就可以解决,因为for循环基于迭代协议
会先将遍历的数据进行_iter_ 变成可迭代类型
然后再调用_next_ 遍历数据
最后捕抓到异常信息,结束遍历
如何遍历一个集合?

s={1,2,3}
s={1,2,3}
s_it=s.__iter__()
print(s_it.__next__())  #也可以用Python自带的next函数 print(next(s_it))
print(s_it.__next__())
print(s_it.__next__())

如何遍历一个字典?

dic={'a':1,'b':2}
dic_it=dic.__iter__()
a=dic_it.__next__()
print(a,dic[a])
a=dic_it.__next__()
print(a,dic[a])

运行结果:
a 1
b 2

文件也是一样的

data=open('seek','r+',encoding='utf-8')
data_it=data.__iter__()
print(data_it.__next__())
print(data_it.__next__())

这样操作可以节省内存空间,可以先不用把所有元素放入内存,只需要调用的时候才放入内存
如何把迭代对象迭代输出,异常就结束?

data=open('seek','r+',encoding='utf-8').__iter__()
while True:
    try:
        print(data.__next__())
    except StopIteration:
        print("输出结束")
        break

猜你喜欢

转载自www.cnblogs.com/children92/p/9240649.html
今日推荐