在玩弄树木时,我偶然发现了这种行为:
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/