一 迭代器协议
1.迭代器协议
- 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退)
2.迭代特点:重复
下一次重复是基于上一次的结果
例: l=['a','b','c','d']0 count=0 while count < len(l): print(l[count] count+=1
d={'a':1,'b':2,'c':3} for k in d: print(k)
2.可迭代对象:
- python为了提供一种不依赖与索引的迭代方式,python会为一些对象内置__iter__方法
- obj.__iter__成为可迭代的对象。
s1='hello' l=[1,2,3,] t=(1,2,3) set1={1,2,3} d={'a':1,'b':2,'c':3} f=open('b.txt',encoding='utf-8')
3.得到的迭代器特点
- 既有__iter__又有一个__next__方法
4.迭代器的优点
- 提供了一种不依赖于索引的取值方式
- 惰性计算,节省内存
5.迭代器的缺点
- 取值不如按照索引取值方便
- 一次性的,只能往前走不能往后退
- 无法获取长度
二 迭代器的形式
1 l=['a','b','c'] 2 #一:下标访问方式 3 print(l[0]) 4 print(l[1]) 5 print(l[2]) 6 # print(l[3])#超出边界报错:IndexError 7 8 #二:遵循迭代器协议访问方式 9 diedai_l=l.__iter__() 10 print(diedai_l.__next__()) 11 print(diedai_l.__next__()) 12 print(diedai_l.__next__()) 13 # print(diedai_l.__next__())#超出边界报错:StopIteration 14 15 #三:for循环访问方式 16 #for循环l本质就是遵循迭代器协议的访问方式,先调用diedai_l=l.__iter__()方法,或者直接diedai_l=iter(l),然后依次执行diedai_l.next(),直到for循环捕捉到StopIteration终止循环 17 #for循环所有对象的本质都是一样的原理 18 19 for i in l:#diedai_l=l.__iter__() 20 print(i) #i=diedai_l.next() 21 22 #四:用while去模拟for循环做的事情 23 diedai_l=l.__iter__() 24 while True: 25 try: 26 print(diedai_l.__next__()) 27 except StopIteration: 28 print('迭代完毕了,循环终止了') 29 break