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 next
funkcji?
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())
python
python-3.x
Maks
źródło
źródło
for i in range(n)
, dlaczegoyield
po 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.for
wywoła obiekt generatora utworzony z Twojej funkcji, uruchomi kod w Twojej funkcji od początku do momentu trafieniayield
, 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 )Odpowiedzi:
W Pythonie 3 użyj
next(uptofive)
zamiastuptofive.next()
.Wbudowana
next()
funkcja działa również w Pythonie 2.6 lub nowszym.źródło
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 wbudowanej
next()
(która następnie próbuje znaleźć metodę obiektu__next__()
).źródło