【问题标题】:Confused about yield and return [duplicate]对产量和回报感到困惑[重复]
【发布时间】:2019-04-04 03:08:10
【问题描述】:

下面有一个代码sn-p:

def yield_5():
    for i in range(5):
        yield i

def foo(use_yield):
    if use_yield:
        for i in yield_5():
            yield i
    else:
        return list(yield_5())

当我执行list(foo(True)) 时,我得到:[0, 1, 2, 3, 4] 符合预期

但是当我这样做时:foo(False) 我得到:[]

为什么会这样?

【问题讨论】:

标签: python python-3.x generator yield


【解决方案1】:

在 python 中,就像在大多数语言中一样,这是一种惰性枚举形式。返回的是一个生成器,其值仅在需要下一个值时才实际创建。

这实际上是yield这个词经常用于此的原因。当您调用包含yield 语句的函数时,它会立即将(yield)控制权返回给控制函数。当需要生成器的第一个值时,它将运行该函数,直到它遇到第一个 Yield 语句,然后它将 (yield) 控制权返回给父函数。它将继续这种模式。一旦最后一个 Yield 值被执行(达到 Yielding 函数的末尾),这被认为是迭代的“结束”。

在您的示例中,令人困惑的是您在 foo() 函数中同时拥有 yieldreturn。发生这种情况时,return 充当StopIteration(因此你得到一个空数组)。在这里看到这个问题: Return and yield in the same function

【讨论】:

    猜你喜欢
    • 2018-08-15
    • 2015-02-11
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2020-08-21
    • 2016-02-21
    相关资源
    最近更新 更多