Python篇-迭代器

2018-10-23  本文已影响7人  TianTianBaby223

一 : 迭代器协议简述 :

迭代器协议是指,对象必须提供一个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__()效果一样

上一篇下一篇

猜你喜欢

热点阅读