【问题标题】:How does the program control flow in generator? [duplicate]生成器中的程序控制流程如何? [复制]
【发布时间】:2019-11-07 21:29:50
【问题描述】:

我试图在定义生成器时了解控制流程。

def countdown(num)
    print('Starting')
    while num > 0:
        yield num
          num -= 1
val = countdown(5)

当我打电话给next(val) 时,Starting 被打印出来,后面跟着数字 5 但在随后的通话中,只有号码被打印出来。为什么我没有看到Starting?为什么当我调用next(val) 5 次以上时它会显示错误?任何有助于理解控制流的帮助将不胜感激

【问题讨论】:

  • 欢迎来到 SO。这不是帮助论坛或讨论论坛。请花时间阅读How to Ask 和该页面上的其他链接。当生成器 完成 时,它会引发 StopIteration 异常 - 很确定这在文档中。

标签: python python-2.7


【解决方案1】:

第一次调用next()时,从函数体的开头开始执行,一直持续到下一个yield语句,该语句右侧的值被返回。

next() 的后续调用从yield 语句继续到函数的结尾,然后循环并从while 循环的开头继续,直到调用另一个yield

如果没有调用 yield(在您的情况下,这意味着您不会进入 while 函数,因为 num <= 0)将引发 StopIteration 异常。

【讨论】:

  • 感谢您指出。希望它现在正确
  • 差不多,是的! while 是一个语句,而不是一个函数,您指的是while 块,即while 语句之后的缩进块。
【解决方案2】:

Starting 移动到 while 块内:

def countdown(num):
    while num > 0:
        print('Starting')
        num -= 1
        yield num

val = countdown(5)
for i in range(5):
    print(next(val))

输出:

Starting
4
Starting
3
Starting
2
Starting
1
Starting
0

【讨论】:

    【解决方案3】:

    嗯,目前您只打印一次Starting,因为它不是yielded,所以它带有第一个yield。为什么它在到达0 后不应该抛出错误?它应该,因为yield 的悔改将停止,而next 只有在还有更多yield 的情况下才有效。要稍微调整一下,使它不会只打印 Starting5,而是打印其他数字,并且不会引发任何错误,请执行以下操作:

    def countdown(num):
        while num > 0:
            print('Starting')
            yield num
            num -= 1
        while True:
            yield 'The number reached zero, it stopped'
    val = countdown(5)
    

    测试:

    for i in range(10):
        print(next(val))
    

    给予:

    Starting
    5
    Starting
    4
    Starting
    3
    Starting
    2
    Starting
    1
    The number reached zero, it stopped
    The number reached zero, it stopped
    The number reached zero, it stopped
    The number reached zero, it stopped
    The number reached zero, it stopped
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-14
      • 1970-01-01
      • 2011-08-20
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      相关资源
      最近更新 更多