20、迭代器

一 迭代器协议

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
迭代器的例子
原文地址:https://www.cnblogs.com/f1443526266/p/7018354.html