у генераторі врожаю в python 3 немає функції 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"? Натомість після першого значення в діапазоні код продовжується і видає весь діапазон, що, на мій погляд, дохід викликається кілька разів одночасно. У мене є невеликі проблеми з розумінням нюансу.
Mike S

Під час першого forвиклику об’єкта генератора, створеного з вашої функції, він запускатиме код у вашій функції з самого початку, доки він не потрапить yield, потім поверне перше значення циклу. Потім кожен виклик ще раз запустить цикл, який ви записали у функції, і поверне наступне значення, поки не буде значення, яке потрібно повернути. (взято з цього посібника )
Маттіа Патерна

Відповіді:


123

У Python 3 використовуйте next(uptofive)замість uptofive.next().

Вбудована next()функція також працює в Python 2.6 або вище.


36
Whyyyyyyyyyyyyyy
Kenny

44

У Python 3, щоб зробити синтаксис більш послідовним, next()метод було перейменовано на __next__(). Ви можете використати цей. Це пояснюється в PEP 3114 .

Дотримуючись рішення Грега, рекомендується викликати вбудовану next()функцію (яка потім намагається знайти метод об’єкта __next__()).


1
Зокрема, оскільки функція переносна між версіями 2 та 3, тоді як методи (через зміну назви) не є.
holdenweb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.