我是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
语句,依此类推,直到函数结束。