python - 递归数据结构的 yield

标签 python

我正在尝试使用带有 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/

相关文章:

python - GDAL:python 中缺少 jp2 驱动程序

python - DiracDelta 没有给出正确的结果

python - scipy UnivariateSpline 因多值 X 而失败

python - 如何在 Linux 中激活 virtualenv?

javascript - Python从<script> html标签内获取数据值

python - 无法从另一个 Docker 容器中的 Python 应用程序连接到在 Docker 容器中运行的 Postgres 数据库

python - 在python中使用两个数据集之间的fuzzywuzzy匹配创建标志

python - 如何删除聚类图中的 x 和 y 轴标签?

python - Pandas 重新采样不返回任何内容

python - Python 中的双百分号有什么作用?