具有 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 一项。等等。
我在网上找到了下面的一段代码,实际 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 一项。等等。