1、什么是迭代器协议
- 迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么引起一个StopIteration异常,以终止迭代(只能往后走不能往前退)
- 可迭代对象:实现了迭代器协议的对象
- 迭代器有两个基本的方法:iter() 和 next()。
2、for循环机制
for循环的本质:将对象用__iter__转换成可迭代对象,调用其next()方法。
字符串、列表、元组、字典、集合、文件对象,这些都不是可迭代对象,只不过在for循环时,调用了他们内部的__iter__方法,把它们变成了可迭代对象。
s="abc"
iter_test=s.__iter__() #遵循迭代器协议,生成可迭代对象
print(iter_test.__next__()) #输出a
print(iter_test.__next__()) #输出b
print(iter_test.__next__()) #输出c
print(iter_test.__next__()) #抛出异常StopIteration
3、为何要有for循环
对于序列类型,如字符串、列表、元组都有下标,可用索引的方式访问对象元素,例:
l=[1,2,3]
index=0
while index<len(l)
print(l[index])
index+=1
但是非序列类型对象,如字典、集合、文件,上述方法并不太好使。
而for循环就是基于迭代器协议提供了一个统一的可遍历所有对象的方法。
即在遍历之前,先调用对象的__iter__方法将其转换成一个迭代器。然后就可以使用迭代器对象的__next__方法,遍历循环。
4、字典的可迭代对象
dic={"a":1,"b":2,"c":3}
iter_dic=dic.__iter__()
print(iter_dic.__next__()) #输出a,遍历的是key
print(iter_dic.__next__()) #输出b,遍历的是key
字典用__iter__转换成可迭代对象,遍历出的是key的值。
这也说明了,for遍历字典为什么遍历的是key