【问题标题】:Generator object with yield带产量的生成器对象
【发布时间】:2015-07-26 11:41:29
【问题描述】:

我在网上找到了下面这段代码,实际是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() 是否跳过了生成器的序列?我似乎无法理解这里的流程

【问题讨论】:

标签: python generator yield


【解决方案1】:

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

但要回答你的问题,为什么它会出错,当你像以前那样做时会出错:

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

如果您按照应有的方式将第二个生成器分配回g,那么您可以要求那个 生成器给您 一项。以此类推。

【讨论】:

    【解决方案2】:

    这是你想要的吗?

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

    【讨论】:

    • 其实代码不是我写的,是在网上找到的,答案是3 StopIteration,所以只是想了解一下代码的流程
    • @Bad_Coder 3 打印在第一条指令中,因为 start 不等于 3 返回 countdown(start -1) 并停止迭代
    • @Bad_Coder 你能给我们链接吗?
    • @wwii 是的,谢谢,我也找到了(比我想象的要容易)并自己写了一个答案。
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2020-01-18
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多