我下面有一个代码段:
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)
我会得到:[]
为什么会这样?
答案 0 :(得分:0)
与大多数语言一样,在python中,这是一种惰性枚举形式。返回的是生成器,其值仅在需要下一个值时才实际创建。
这实际上是单词yield
经常用于此目的的原因。当您调用包含yield语句的函数时,它将立即将(yield)控制权返回给控制函数。当需要Generator的第一个值时,它将运行该函数,直到命中第一个Yield语句为止,然后它将(yield)控制权返回给父函数。它将继续这种模式。一旦行使了最后一个Yield值(达到了Yielding函数的末尾),就将其视为迭代对象的“末尾”。
在您的示例中,混乱之处在于您在yield
函数中同时拥有return
和foo()
。发生这种情况时,return
会充当StopIteration
(因此为什么会得到一个空数组)。在这里看到这个问题:
Return and yield in the same function