【问题标题】:Python Generator: confusing resultPython 生成器:令人困惑的结果
【发布时间】:2016-01-11 01:24:18
【问题描述】:

我正在使用生成器以更好地了解它们的工作原理,但我对以下代码的结果感到困惑:

>>> def gen():
...  for i in range(5):
...   yield i
...
>>> count=gen()
>>> for i in count:
...  print count.next()
...
1
3
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
StopIteration
>>>

这里发生了什么?看起来当它遇到“for i in count:”行时,生成器会产生第一个值。我不知道。

编辑:我应该补充一点,我并不是想“做对”。我试图打破一些东西,看看 Python 是如何反应的。当我产生错误时,我会更多地了解该语言。这个错误让我很困惑,但现在一切都清楚了。 到目前为止,所有的答案都是简短而甜蜜的。谢谢大家!

【问题讨论】:

  • for i in countcount.next() 试图获得下一个项目 - 为什么你在同一个循环中使用它们?!

标签: python generator yield next


【解决方案1】:

你的代码应该是这样的

代码:

def gen():
    for i in range(5):
        yield i

count=gen()
for i in count:
    print i

输出:

0
1
2
3
4

注意事项:

当您循环 for i in count 时,您试图再次在此处获取下一项 count.next() 您试图获取第二个元素。所以基本上您正在尝试从当前位置获取元素 +2

所以你的代码中发生的情况如下:

步骤:

1.for i in count这里得到下一个值是0

2.print count.next() 这里再次调用并打印下一个值,因此打印1

3.for i in count 这里再次调用下一个值,即2

4.print count.next() 这里再次调用并打印下一个值,因此打印3

5.for i in count 这里再次调用下一个值,即4

6.最后你在这里调用print count.next(),因为生成器中没有值。你已经给出了异常StopIteration

【讨论】:

    【解决方案2】:

    因为“for”循环已经迭代了您的生成器值,所以每一步都会产生两个值:一个在“for”中,一个在循环体中。

    【讨论】:

    • 我真的很喜欢你用一句话捕捉到一切的方式。我试图制定一个简短的答案,但我做不到。
    【解决方案3】:

    for i in count: 已经在调用 next(并将值分配给 i)。然后您的代码再次调用 next。

    如果你只想打印每个值

    for i in count:
        print i
    

    还是要走很长的路

    while True:
        try:
            print count.next()
        except StopIteration, si:
            break
    

    【讨论】:

    • 你的“漫漫长路”很有趣。这个我也练一下。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多