具有 yield 的生成器对象

Generator object with yield

我在网上找到了下面的一段代码,实际 output

def countdown(start):
   print start
   if start == 0:
      yield 0
   else:
      yield countdown(start -1)

g = countdown(3)
g.next()
g.next()

代码的输出是

3 StopIteration

任何人都可以为我分解这段代码,next() 是否跳过了生成器的序列?我似乎无法理解这里的流程

这是你想要的吗?

def countdown(start):
  if start >= 0:
    yield start
    for i in countdown(start -1):
      yield i

g = countdown(3)
g.next()  #3
g.next()  #2
g.next()  #1
g.next()  #0
g.next()  #StopIteration

问题

yield countdown(start -1) return 生成器和迭代然后停止

我认为您没有在 Internet 上找到 那个 代码。你似乎错过了 that blog post 的全部要点,如果你使用 g = g.next() 而不是 g.next() 就像它在那里显示的那样,那么它就有意义并且有效。

但要回答你的问题,为什么它会出错,就像你这样做时出错的方式一样:

countdown 只产生一件事,要么是 0,要么是另一个生成器。 g.next() 获取了那个东西,因为你没有对它做任何事情,所以它丢失了。然后,由于 g 仍然是原始生成器,并且它已经给了你它必须给的东西,所以当你向它请求第二件事时,你会得到 StopIteration

如果你像你应该的那样将第二个生成器分配回 g,那么你可以要求 that 生成器给你 its 一项。等等。