Iteratori infiniti
Lezione 6 di 13 del corso Iteratori in Python di Coddy.
Gli iteratori infiniti sono un tipo speciale di iteratore in Python che può generare potenzialmente una sequenza infinita di valori. A differenza degli iteratori finiti, che prima o poi sollevano un’eccezione StopIteration, gli iteratori infiniti continuano a produrre valori indefinitamente.
Caratteristiche degli iteratori infiniti
- Non sollevano mai un’eccezione
StopIteration. - Possono essere utili per generare sequenze continue o simulare flussi di dati infiniti.
- Quando li usi, devi fare attenzione a evitare cicli infiniti.
Creare un iteratore infinito
Ecco un semplice esempio di iteratore infinito che genera una sequenza infinita di numeri interi:
class InfiniteCounter:
def __init__(self, start=0):
self.count = start
def __iter__(self):
return self
def __next__(self):
current = self.count
self.count += 1
return current
# Uso
counter = InfiniteCounter()
for i in counter:
print(i)
if i >= 5:
break # Evita un bucle infinito
In questo esempio, la classe InfiniteCounter continuerà a generare numeri indefinitamente. Usiamo un’istruzione break per interrompere l’iterazione al verificarsi di una determinata condizione.
Iteratori infiniti integrati
Il modulo itertools di Python fornisce diversi utili iteratori infiniti:
itertools.count(start, step): conta all’infinito a partire da un valore inizialeitertools.cycle(iterable): scorre un iterabile indefinitamente, ripartendo dall’inizioitertools.repeat(elem, [n]): ripete un elemento indefinitamente o n volte
Esempio con itertools.count():
from itertools import count
for i in count(10):
print(i)
if i >= 15:
break
# Outputs: 10, 11, 12, 13, 14, 15
Avvertenze e buone pratiche
- Prevedi sempre un modo per uscire dai cicli che usano iteratori infiniti, così da evitare che il programma si blocchi.
- Usa gli iteratori infiniti con criterio e solo quando necessario.
- Valuta l’uso di funzioni generatore per ottenere sequenze infinite con un uso più efficiente della memoria.
Gli iteratori infiniti sono uno strumento potente per gli scenari che richiedono la generazione o l’elaborazione continua di dati, ma vanno usati con cautela per assicurarti che il tuo programma si comporti come previsto.
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 infinita chiamata CyclicCounter che cicli indefinitamente attraverso un intervallo di numeri specificato. L'iteratore dovrebbe partire da un numero specificato e tornare a esso dopo aver raggiunto la fine dell'intervallo.
Ti vengono forniti i seguenti dati:
- Due interi come input:
starteend(inclusi)
La tua classe CyclicCounter dovrebbe:
- Implementare i metodi
__iter__()e__next__() - Generare numeri da
startaend(inclusi) - Dopo aver raggiunto
end, tornare astarte continuare indefinitamente
Dopo aver implementato la classe CyclicCounter, creane un'istanza usando i valori di input. Poi, usa un ciclo per stampare i primi 10 numeri generati dall'iteratore, ciascuno su una nuova riga.
L'input verrà fornito come due interi separati da uno spazio, che rappresentano start e end.
Provalo tu
# Leggi l'input
start, end = map(int, input().split())
class CyclicCounter:
def __init__(self, start, end):
self.start = start
self.end = end
self.current = start
def __iter__(self):
return self
# TODO: Implementa il metodo __next__()
# Crea un'istanza di CyclicCounter
counter = CyclicCounter(start, end)
# TODO: Usa un ciclo per stampare i primi 10 numeri generati dall'iteratore
# Ricorda di stampare ogni numero su una nuova rigaTutte le lezioni di Iteratori in Python
Esercitati da solo: Compilatore Python online