空发电机

Hyp*_*eus 5 python generator

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

def descendants (self):
    return #or "pass" or "42"
Run Code Online (Sandbox Code Playgroud)

明显回归None.

另一方面:

def descendants (self):
    return
    yield 42
Run Code Online (Sandbox Code Playgroud)

返回一个不产生任何东西的生成器(实际上是叶节点所需的行为).

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

不应该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
Run Code Online (Sandbox Code Playgroud)

jay*_*elm 5

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

这里解释得更简洁.

因此descendants被调用,并且由于yield关键字存在于函数中,因此立即返回生成器对象.由于descendants马上returns ^,然而,发生器所产生的任何值,但它肯定还是发电机.