生成

时间:2015-05-14 18:12:27

标签: python generator 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()是否会跳过生成器的序列?我似乎无法理解这里的流程

2 个答案:

答案 0 :(得分:2)

我不认为您在互联网上找到了那个代码。您似乎错过了that blog post的整个点,如果您使用g = g.next()代替g.next(),就像它在那里显示的那样,那么它就有意义并且有效。

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

countdown只产生一件事,无论是0还是其他生成器。 g.next()提取一件事,因为你不做任何事情,它就会丢失。然后,由于g仍然是原始生成器,并且它已经为您提供了必须给予的一件事,当您再次询问它时,您会得到StopIteration

如果您将第二个生成器分配回g,那么您可以要求 生成器为您提供 一个项目。等等。

答案 1 :(得分:1)

这是你想要的吗?

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)返回生成器并迭代然后停止