为什么 Python 的 yield 语句不能在一个函数中调用,也不能在它调用的另一个函数中调用,为什么尝试时没有报告错误?



我是Python的新手,我发现yield语句非常有用。然而,有一件事让我很惊讶。在一个函数中放入多个yield语句会导致每个语句都出现在for var in fn()循环中。但是,如果我从使用yield语句的初始函数中执行另一个函数,则不会执行该函数。我只是采取了天真的方法,只是觉得它会奏效。

例如

def fn2():
print("blah")
yield "you"

def fn():
yield "hi"
fn2()
yield "there"

for a in fn():
print('{}'.format(a))

如果我注释掉yield "you",我的输出将是:

hi
there

如果没有,那就是:

hi
blah
there

演示

没有任何警告或错误,只是耸耸肩继续执行,这比它不起作用更令人惊讶。

这是怎么回事?

yield的函数是生成器。它们总是产生一个可迭代的,即使其中只有一个yield语句。

为了获得函数产生的值,必须进行迭代。

您可以使用for v in fn2: yield v,但Python也有一个方便的语句:yield from

def fn2():
print("blah")
yield "you"

def fn():
yield "hi"
yield from fn2()
yield "there"

for a in fn():
print('{}'.format(a))

Python的生成器是延迟求值的。创建一个(在本例中"调用fn2">(不会启动迭代。这就是为什么fn2似乎根本没有被调用。它被称为。

把它的返回值想象成fn2函数体第一行前面的书签。一旦你真正开始迭代;书签";将前进到第一个yield语句,依此类推,直到函数结束。

最新更新