nie ma funkcji next () w generatorze zysku w Pythonie 3

84

W tym pytaniu mam nieskończoną sekwencję używającą generatorów Pythona. Ale ten sam kod nie działa w Pythonie 3, ponieważ wydaje się, że nie ma next()funkcji. Jaki jest odpowiednik nextfunkcji?

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())
Maks
źródło
Jak działa ten kod? Rozumiem, że to DZIAŁA, ale z tego co przeczytałem: „Wykonywanie kodu zatrzymuje się po osiągnięciu instrukcji yield”. ( python-course.eu/python3_generators.php ). Więc po pierwsze for i in range(n), dlaczego yieldpo prostu nie zwraca „1”? Zamiast tego, po pierwszej wartości z zakresu, kod kontynuuje i zwraca cały zakres, który wydaje mi się być taki, że wydajność jest wywoływana wiele razy na raz. Mam mały problem ze zrozumieniem niuansów.
Mike S
Gdy po raz pierwszy forwywoła obiekt generatora utworzony z Twojej funkcji, uruchomi kod w Twojej funkcji od początku do momentu trafienia yield, a następnie zwróci pierwszą wartość pętli. Następnie kolejne wywołanie jeszcze raz uruchomi pętlę, którą zapisałeś w funkcji i zwróci następną wartość, aż nie będzie żadnej wartości do zwrócenia. (zaczerpnięte z tego samouczka )
Mattia Paterna

Odpowiedzi:

123

W Pythonie 3 użyj next(uptofive)zamiast uptofive.next().

Wbudowana next()funkcja działa również w Pythonie 2.6 lub nowszym.

Greg Hewgill
źródło
36
Whyyyyyyyyyyyyyy
Kenny Worden
44

W Pythonie 3, aby uczynić składnię bardziej spójną, next()zmieniono nazwę metody na __next__(). Możesz użyć tego. Wyjaśniono to w PEP 3114 .

Zalecane jest skorzystanie z rozwiązania Grega i wywołanie funkcji wbudowanejnext() (która następnie próbuje znaleźć metodę obiektu __next__()).

cfi
źródło
1
Zwłaszcza, że ​​funkcja jest przenośna między wersjami 2 i 3, podczas gdy metody (ze względu na zmianę nazwy) nie.
holdenweb