python 3中的yield generator中没有next()函数


84

这个问题中,我有一个使用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。我在理解细微差别时遇到了一些麻烦。
迈克S

第一次for调用从函数创建的生成器对象时,它将从头开始运行函数中的代码,直到命中为止yield,然后它将返回循环的第一个值。然后,每次其他调用将再次运行您在函数中编写的循环,并返回下一个值,直到没有值可返回为止。(摘自本教程
Mattia Paterna

Answers:



44

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

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


1
特别是由于该函数在版本2和版本3之间是可移植的,而方法(由于名称更改)不是可移植的。
holdenweb '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.