标签:
#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对象
标签:
原文地址:http://www.cnblogs.com/mujinxiyan/p/5748986.html