Implementare __next__()
Lezione 5 di 13 del corso Iteratori in Python di Coddy.
Il metodo __next__() è una parte fondamentale della creazione di iteratori personalizzati in Python. Definisce come recuperare l'elemento successivo nella sequenza di iterazione. Quando implementi __next__(), controlli il comportamento del tuo iteratore, determinando quali valori produce e quando deve fermarsi.
Scopo di __next__()
Il metodo __next__() ha due scopi principali:
- Restituire l'elemento successivo nella sequenza
- Sollevare un'eccezione
StopIterationquando non ci sono più elementi
Implementare __next__()
Ecco una struttura di base per implementare __next__():
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
result = self.data[self.index]
self.index += 1
return result
Aspetti chiave di __next__()
- Gestione dello stato: Tieni traccia dello stato corrente dell'iterazione (ad esempio, usando un indice).
- Restituire l'elemento successivo: Determina e restituisci l'elemento successivo nella sequenza.
- StopIteration: Solleva
StopIterationquando non ci sono più elementi. - Effetti collaterali: Aggiorna lo stato interno necessario per l'iterazione successiva.
Esempio: iteratore di intervallo personalizzato
Ecco un esempio di iteratore personalizzato che imita una versione semplificata di range()</function> di Python:</p>
<pre><code class="language-python">class CustomRange:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current >= self.end:
raise StopIteration
result = self.current
self.current += 1
return result
# Using the custom range iterator
for num in CustomRange(1, 5):
print(num) # Outputs: 1, 2, 3, 4
In questo esempio, __next__() restituisce il numero corrente e lo incrementa per l'iterazione successiva, sollevando StopIteration quando raggiunge il valore finale.
Implementando __next__(), definisci il comportamento fondamentale del tuo iteratore, consentendogli di funzionare senza problemi con i meccanismi di iterazione di Python, come i cicli for e la funzione next().
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Sfida
FacileCrea una classe iteratore personalizzata chiamata FibonacciIterator che genera numeri di Fibonacci fino a un limite specificato. La sequenza di Fibonacci inizia con 0 e 1, e ogni numero successivo è la somma dei due precedenti.
Ti viene fornito quanto segue:
- Un intero
limitcome input
La tua classe FibonacciIterator dovrebbe:
- Implementare il metodo
__next__()per generare il numero di Fibonacci successivo - Interrompere l'iterazione quando il numero di Fibonacci successivo supererebbe il limite specificato
- Sollevare un'eccezione
StopIterationquando la sequenza è esaurita
Dopo aver implementato la classe FibonacciIterator, creane un'istanza usando il limite fornito come input e stampa ogni numero di Fibonacci generato su una nuova riga.
L'input verrà fornito come una stringa che rappresenta un intero.
Provalo tu
# Leggi l'input
limit = int(input())
class FibonacciIterator:
def __init__(self, limit):
self.limit = limit
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
# TODO: Implementa il metodo __next__()
# Genera il prossimo numero di Fibonacci
# Genera StopIteration quando la sequenza è terminata
pass
# Crea un'istanza di FibonacciIterator
fib_iterator = FibonacciIterator(limit)
# TODO: Scorri la sequenza di Fibonacci e stampa ogni numero
# Nota: Assicurati di stampare ogni numero di Fibonacci per superare i testTutte le lezioni di Iteratori in Python
Esercitati da solo: Compilatore Python online