【问题标题】:there's no next() function in a yield generator in python 3python 3 的产量生成器中没有 next() 函数
【发布时间】:2012-08-29 18:28:18
【问题描述】:

this question 中,我有一个使用 Python 生成器的无穷序列。但是相同的代码在 Python 3 中不起作用,因为似乎没有 next() 函数。 next 函数的等价物是什么?

def updown(n):
    while True:
        for i in range(n):
            yield i
        for i in range(n - 2, 0, -1):
            yield i

uptofive = updown(6)
for i in range(20):
    print(uptofive.next())

【问题讨论】:

  • 这段代码是如何工作的?我知道它确实有效,但从我读到的内容来看,“当达到 yield 语句时,代码的执行停止”。 (python-course.eu/python3_generators.php)。那么在第一个for i in range(n) 中,为什么yield 不简单地返回“1”?相反,在范围中的第一个值之后,代码继续,并产生整个范围,在我看来,这似乎是一次多次调用 yield。我很难理解其中的细微差别。
  • for第一次调用从你的函数创建的生成器对象,它会从头开始运行你的函数中的代码,直到它到达yield,然后它会返回第一个值的循环。然后,每个其他调用将再次运行您在函数中编写的循环,并返回下一个值,直到没有值可以返回。 (取自this tutorial

标签: python python-3.x


【解决方案1】:

在 Python 3 中,使用 next(uptofive) 而不是 uptofive.next()

内置的next() 函数也适用于 Python 2.6 或更高版本。

【讨论】:

【解决方案2】:

在 Python 3 中,为了使语法更加一致,next() 方法被重命名为 __next__()。你可以用那个。 PEP 3114 对此进行了解释。

建议遵循 Greg 的解决方案并调用 builtin next() function(然后尝试查找对象的 __next__() 方法)。

【讨论】:

  • 特别是因为函数可以在版本 2 和 3 之间移植,而方法(因为名称更改)不能。
猜你喜欢
  • 2016-12-16
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2020-10-10
  • 2020-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多