python - 空发电机

标签 python generator

在玩弄树木时,我偶然发现了这种行为:

def descendants (self):
    return #or "pass" or "42"

显然返回 None

另一方面:

def descendants (self):
    return
    yield 42

返回一个不产生任何结果的生成器(实际上是我需要的叶节点行为)。

有人可以向我解释一下这里发生了什么吗?

yield 42 不应该是无法访问的代码吗?(我猜一个函数是生成器还是“普通”函数的决定是在编译时做出的,基于它是否包含一个或多个 yield 语句,无论它们是否可达。但这只是在黑暗中的一枪。)


上下文如下:我有树,每个节点要么是树,要么是叶子。现在我想生成一个节点的所有后代:

class Leaf (Node):
    @property
    def descendants (self):
        return
        yield 42

class Tree (Node):
    @property
    def descendants (self):
        for child in self.children:
            yield child
            yield from child.descendants

最佳答案

据我了解,函数内的 yield 关键字是在编译时检测到的。结果是该函数的行为不再像普通函数那样。当调用带有 yield 关键字的函数时,该函数立即返回一个惰性生成器对象,该对象根据定义的函数根据需要生成变量。函数中的代码仅在迭代生成器时运行。

解释得更简洁here.

因此 descendants 被调用,并且由于函数中存在 yield 关键字,因此立即返回一个生成器对象。由于 descendants 立即 return,因此生成器不产生任何值 - 但它肯定仍然是生成器。

关于python - 空发电机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22977947/

相关文章:

python - 如何在保持元组顺序的同时,根据元组的索引值从列表中删除重复的元组?

Python- "in"和 "in x for x in"有什么区别

python - 生成器因 NoneType 错误而失败

python - 这个产量在这个生成器中是如何工作的?

javascript - 如何重构 redux-saga 生成器函数?

Python 生成器每次调用产生相同的值

python - 比较 2 个数据框并找到匹配的行

python - 使用 python 从字符串中查找并替换标记的单词?

python - 如何在wxpython中创建一个仅包含TaskBarIcon的应用程序?

python - 如何使用python从网页下载所有可下载的内容?