我在互联网上找到了以下代码,其中包含实际的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()
是否会跳过生成器的序列?我似乎无法理解这里的流程
答案 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)
返回生成器并迭代然后停止