【问题标题】:Why can Python's yield statement not be called in a function and also in another function that it calls and why no error reported when attempted?为什么 Python 的 yield 语句不能在一个函数以及它调用的另一个函数中调用,为什么在尝试时没有报告错误?
【发布时间】:2022-01-05 13:13:54
【问题描述】:

我是 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

Demo

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

这是怎么回事?

【问题讨论】:

    标签: python yield


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 2021-08-07
      • 2014-09-03
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多