一 : 迭代器协议简述 :
迭代器协议是指,对象必须提供一个next
方法,执行该方法要么返回迭代中的下一项,要么就引起一个Stoplteration异常,以终止迭代,(只能往前面走不能往后面退)
可迭代对象 : 实现了迭代器协议的对象
协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min,max函数)使用迭代器协议访问对象
二 : for循环内部原理
for循环的本质就是循环所有对象,全都使用迭代器协议
(字符串 , 列表 , 元祖 , 字典 ,集合 ,文件对象) 这些都不是可迭代对象,只不过for循环中调用了他们内部的__iter__
方法,把他们变成了可迭代对象
然后for循环调用可迭代对象的__next__
方法去取值,而for循环会捕捉Stoplteration
异常,终止迭代
将字符串变为可迭代对象
mystr = '思思'
iter_test = mystr.__iter__()
print(iter_test)
<str_iterator object at 0x10f30a198>
调用__next__
方法
print(iter_test.__next__())
print(iter_test.__next__())
思
思
第三次调用__next__
报错
print(iter_test.__next__())
print(iter_test.__next__())
StopIteration
在for循环中相当于先调用__iter__()
在调用__next__()
把 l
先变成可迭代对象,再调用其__next__()
方法
l = [1,2,3]
for i in l: #i_l = l.__iter__() i_l.__next__()
print(i)
for循环就是基迭代器协议提供了一个统一的可以遍历所有对象的方法,包括序列类型与非序列类型,即在遍历之前,先调用对象的__iter__
方法将其转换成一个迭代器,然后使用迭代器协议去实现循环访问,这样所有的对象就可以通过for循环来遍历了
-
遍历集合
for i in {1,2,3}:
print(i)
-
遍历文件
相当于将 f
变成可迭代对象f.__iter__()
,然后再f.__next__()
,这个迭代器对象并不是把所有的文件资源放入内存中,而是一个对象,类似于一个地址
for i in f:
print(i)
-
next()
next
与 __next__()
效果一样
网友评论