【发布时间】:2010-12-29 17:19:45
【问题描述】:
我的代码运行错误
class a(object):
def __iter(self):
return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()
请尽量使用代码,而不是文字,因为我的英文不是很好,谢谢
【问题讨论】:
我的代码运行错误
class a(object):
def __iter(self):
return 33
b={'a':'aaa','b':'bbb'}
c=a()
print b.itervalues()
print c.itervalues()
请尽量使用代码,而不是文字,因为我的英文不是很好,谢谢
【问题讨论】:
一个。拼写正确:不是
def __iter(self):
但是:
def __iter__(self):
在__之前和在iter之后。
b.使身体正确:不
return 33
但是:
yield 33
或 返回迭代器([33])
如果您 return 来自 __iter__ 的值,则返回一个迭代器(一个 iterable,就像在 return [33] 中一样,几乎和 return [33] 一样好,但并不完全......);否则,yield 1+ 个值,使 __iter__ 成为生成器函数(因此它本质上返回生成器迭代器)。
c。说得对:不是
a().itervalues()
但是,例如:
for x in a(): print x
或
print list(a())
itervalues是dict的方法,与__iter__无关。
如果您修复了所有三个 (!) 错误,代码会运行得更好;-)。
【讨论】:
yield 33 使 __iter__ 成为生成器函数(not generator expression - 这是一个不同的构造;-),所以它返回一个生成器,它是一个迭代器; return [33] 返回一个可迭代但不是迭代器,所以这有点不完美——编辑答案来解决这个问题!-)
关于你的代码的一些事情:
__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() 函数,所以这是一个迭代器对象。
当调用下一个函数时,它会保持返回连续值,直到达到零,然后它发送StopIteration 异常,这(适当地)停止迭代。
如果这看起来有点模糊,我建议您尝试一下代码,然后在此处查看文档:http://docs.python.org/library/stdtypes.html
【讨论】:
这是一个实现内置 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
【讨论】:
您错误地使用了此语言功能。
http://docs.python.org/library/stdtypes.html#iterator-types
上面的这个链接将解释该函数的用途。
您可以在此处尝试以您的母语查看文档:http://wiki.python.org/moin/Languages
【讨论】: