我不知道Python中的__iter__,谁能给个好代码示例?
我的代码运行出错了
class a(object):
def __iter(self):
return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()
请尝试使用代码,而不是文字,因为我的英语不是很好,谢谢
4 个回答
1
这里有一个代码示例,展示了如何实现内置的 xrange 功能:
class my_xrange(object):
def __init__(self, start, end, skip=1):
self.curval = int(start)
self.lastval = int(end)
self.skip = int(skip)
assert(int(skip) != 0)
def __iter__(self):
return self
def next(self):
if (self.skip > 0) and (self.curval >= self.lastval):
raise StopIteration()
elif (self.skip < 0) and (self.curval <= self.lastval):
raise StopIteration()
else:
oldval = self.curval
self.curval += self.skip
return oldval
for i in my_xrange(0, 10):
print i
5
关于你的代码,有几点需要注意:
__iter
应该是__iter__
- 你在
__iter__
函数中返回了 '33'。其实你应该返回一个 迭代器对象。迭代器是一个对象,当你调用它的next()
函数时,它会不断返回不同的值(比如一系列值 [0,1,2,3 等等])。
下面是一个迭代器的工作示例:
class a(object):
def __init__(self,x=10):
self.x = x
def __iter__(self):
return self
def next(self):
if self.x > 0:
self.x-=1
return self.x
else:
raise StopIteration
c=a()
for x in c:
print x
类 a
的任何对象都是一个迭代器对象。调用 __iter__
函数应该返回这个迭代器,所以它返回的是它自己。正如你所看到的,a 类有一个 next()
函数,所以这就是一个迭代器对象。
当调用 next 函数时,它会不断返回连续的值,直到返回零,然后它会抛出 StopIteration
异常,这样就(恰当地)停止了迭代。
如果这听起来有点模糊,我建议你动手试试代码,然后查看这里的文档: http://docs.python.org/library/stdtypes.html
17
a. 拼写要正确:不是
def __iter(self):
而是:
def __iter__(self):
在 iter
前后加上 __
。
b. 代码主体要正确:不是
return 33
而是:
yield 33
或者
返回 iter([33])
如果你在 __iter__
里返回一个值,那就返回一个迭代器(一个 可迭代对象,像 return [33]
这样几乎可以,但还是不完全一样...);否则,就用 yield
返回一个或多个值,这样 __iter__
就变成了一个生成器函数(所以它本质上返回一个生成器迭代器)。
c. 调用要正确:不是
a().itervalues()
而是,比如:
for x in a(): print x
或者
print list(a())
itervalues
是字典的方法,和 __iter__
没有关系。
如果你修正这三个 (!) 错误,代码就能更好地工作了;-)。