码迷,mamicode.com
首页 > 编程语言 > 详细

夕颜的python笔记003

时间:2016-08-08 14:15:47      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:

#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对象

夕颜的python笔记003

标签:

原文地址:http://www.cnblogs.com/mujinxiyan/p/5748986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!