我正在尝试使用带有 Python 类的生成器,该类的工作方式与链表有些相似。
这是我的意思的一个非常简单的例子:
class GeneratorTest():
def __init__(self, list):
if list:
self.elem = list[0]
if list[1:]:
self.n = GeneratorTest(list[1:])
else:
self.n = None
def __iter__(self):
return self
def next(self):
my_next = self
while my_next is not None:
yield my_next
my_next = my_next.n
当然这只是一个例子,但足以说明问题。
现在,我希望能够调用类似这样的东西:
g = GeneratorTest([1,2,3,4,5])
for x in g:
print x
当它达到最后一个值时让循环停止,但 for 循环只是无限地继续。
我对生成器还很陌生,所以我确信这是我在这里缺少的基本前提。
问题是否与我生成创建生成器的同一对象有关? 我敢肯定,如果我有一个包含 GeneratorTest 对象列表的对象,我可以非常简单地返回这些对象中的每一个,但我觉得应该有一种方法可以在没有“包装器”对象的情况下完成这项工作。
我在这里错过了什么?
最佳答案
问题是 next
(或者,在 Py3 中,__next__
)不应该是一个生成器——它应该在外部维护它的状态,并且 return
每个值。你的每次都会返回一个新的生成器,但由于 Python 不会迭代 that 生成器,因此你的循环实际上从未运行过。
这可能意味着您希望 __iter__
最初返回 self
以外的东西(尽管它返回的任何内容都需要有一个返回 self 的 __iter__
)。
但好消息是,生成器的存在正是为了为您跟踪这些规则。将您当前的 next
代码移动到 __iter__
中,一切正常 - Python 确实迭代 __iter__
返回的任何内容(就像您希望的那样期待)。
关于python - 递归数据结构的 yield ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11192595/