什么叫迭代?
迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值(迭代只能往后走不能往前退)
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