non esiste la funzione next () in un generatore di rendimento in python 3


84

In questa domanda , ho una sequenza infinita che utilizza i generatori Python. Ma lo stesso codice non funziona in Python 3 perché sembra che non ci sia alcuna next()funzione. Qual è l'equivalente per la nextfunzione?

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())


Come funziona questo codice? Capisco che FUNZIONA, ma da quello che ho letto, "L'esecuzione del codice si interrompe quando è stata raggiunta un'istruzione yield". ( python-course.eu/python3_generators.php ). Quindi nel primo for i in range(n), perché non yieldrestituisce semplicemente "1"? Invece, dopo il primo valore nell'intervallo, il codice continua e restituisce l'intero intervallo, che a me sembra essere che il rendimento viene chiamato più volte contemporaneamente. Ho qualche problema a capire la sfumatura.
Mike S

La prima volta che forchiama l'oggetto generatore creato dalla tua funzione, eseguirà il codice nella tua funzione dall'inizio fino a quando non viene colpito yield, quindi restituirà il primo valore del ciclo. Quindi, ogni altra chiamata eseguirà il ciclo che hai scritto nella funzione ancora una volta e restituirà il valore successivo, finché non ci sarà alcun valore da restituire. (tratto da questo tutorial )
Mattia Paterna

Risposte:


124

In Python 3, usa next(uptofive)invece di uptofive.next().

La funzione incorporata next()funziona anche in Python 2.6 o versioni successive.


37
Whyyyyyyyyyyyyyy
Kenny Worden

44

In Python 3, per rendere la sintassi più coerente, il next()metodo è stato rinominato in __next__(). Potresti usare quello. Questo è spiegato in PEP 3114 .

Si consiglia di seguire la soluzione di Greg e chiamare la funzione incorporatanext() (che quindi cerca di trovare il __next__()metodo di un oggetto ).


1
Soprattutto perché la funzione è portabile tra le versioni 2 e 3, mentre i metodi (a causa del cambio di nome) non lo sono.
holdenweb
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.