对收益率和收益率感到困惑

时间:2018-10-31 01:34:15

标签: python python-3.x generator yield

我下面有一个代码段:

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)我会得到:[]

为什么会这样?

1 个答案:

答案 0 :(得分:0)

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

这实际上是单词yield经常用于此目的的原因。当您调用包含yield语句的函数时,它将立即将(yield)控制权返回给控制函数。当需要Generator的第一个值时,它将运行该函数,直到命中第一个Yield语句为止,然后它将(yield)控制权返回给父函数。它将继续这种模式。一旦行使了最后一个Yield值(达到了Yielding函数的末尾),就将其视为迭代对象的“末尾”。

在您的示例中,混乱之处在于您在yield函数中同时拥有returnfoo()。发生这种情况时,return会充当StopIteration(因此为什么会得到一个空数组)。在这里看到这个问题: Return and yield in the same function