в генераторе доходности в 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»? Вместо этого, после первого значения в диапазоне, код продолжается и дает весь диапазон, который, как мне кажется, заключается в том, что yield вызывается несколько раз одновременно. У меня небольшие проблемы с пониманием нюанса.
Mike S
В первый раз, когда forвызывается объект-генератор, созданный из вашей функции, он запускает код в вашей функции с самого начала до тех пор, пока не попадет в него yield, а затем вернет первое значение цикла. Затем каждый другой вызов будет запускать цикл, который вы написали в функции, еще раз и возвращать следующее значение, пока не будет возвращаемого значения. (взято из этого урока )
Маттиа Патерна

Ответы:

123

В Python 3 используйте next(uptofive)вместо uptofive.next().

Встроенная next()функция также работает в Python 2.6 или выше.

Грег Хьюгилл
источник
36
Whyyyyyyyyyyyyyy
Кенни Уорден
44

В Python 3 для большей согласованности синтаксиса next()метод был переименован в __next__(). Вы могли бы использовать это. Это объясняется в PEP 3114 .

Рекомендуется следоватьnext() решению Грега и вызывать встроенную функцию (которая затем пытается найти __next__()метод объекта ).

CFI
источник
1
Тем более, что функция переносима между версиями 2 и 3, а методы (из-за изменения имени) - нет.
Holdenweb