#coding:utf-8#今天写个迭代器 class MyIterator(object): def __init__(self): self._res = [1,2,3] self._n = 0 def next(self): if self._n>=len(self._res): raise StopIteration() print ‘mynext‘ temp = self._res[self._n] self._n+=1 return temp def __iter__(self): print ‘myiter‘ return self test = MyIterator()q = MyIterator()for i in test:这里执行的时候,首先会进入test的iter,然后进入test的next,因为用next来获取元素。 for j in q:
print i,j
然后进入q的iter和next,执行3次,然后输出了1,1,1,2,1,3.然后问题来了。当test的next再次执行的时候i变成1,再次调用q的next的时候,发现q的_n还是3,不会进行第二次循环。那么,要如何在q内知道test的循环次数呢? 这时候让iter返回一个新的迭代器对象也许是可以的,这样每次都是一个新的迭代器对象于是就有了下面的
class NewIterator(object): def __init__(self, n): self._index = 0; self._n = n def next(self): if self._index<=self._n: temp = self._index self._index += 1 return temp else: raise StopIteration() def __iter__(self): return self class DDIteratror(object): def __init__(self, n): self._n = n def __iter__(self): return NewIterator(self._n) test1 = DDIteratror(5)for i in test1: for j in test1: print i,j
通过iter()方法获得了list的迭代器对象,然后就可以通过next()方法来访问list中的元素了。当容器中没有可访问的元素后,next()方法将会抛出一个StopIteration异常终止迭代器。
由此来看for语句的时候,for语句是会自动的通过__iter__()方法来获得迭代器对象,并且通过next()方法来获取下一个元素。如最后这一部分,会首先调用test1的iter,返回了一个NewIterator对象,然后调用这个NewIterator对象的next来返回值。然后得到0,然后进入j的循环
又获得一个NewIterator对象,然后调用next返回0.然后接着调用next返回1,直至5,raise StopIteration,然后回到上一级别,调用next获得下一个值,然后又进入内层for语句,调用iter返回一个NewIterator对象
时间: 2024-10-18 01:07:04