Menu
Coddy logo textTech

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 iniziale
  • itertools.cycle(iterable): scorre un iterabile indefinitamente, ripartendo dall’inizio
  • itertools.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.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

challenge icon

Sfida

Facile

Crea 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: start e end (inclusi)

La tua classe CyclicCounter dovrebbe:

  • Implementare i metodi __iter__() e __next__()
  • Generare numeri da start a end (inclusi)
  • Dopo aver raggiunto end, tornare a start e 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 riga

Tutte le lezioni di Iteratori in Python

Esercitati da solo: Compilatore Python online