Menu
Coddy logo textTech

Eccezione StopIteration

Lezione 3 di 13 del corso Iteratori in Python di Coddy.

L'eccezione StopIteration è un componente fondamentale del protocollo degli iteratori di Python. Segnala la fine di una sequenza di iterazione e svolge un ruolo essenziale nel controllare il comportamento degli iteratori. Esploriamo questa eccezione e la sua importanza.

Che cos'è StopIteration?

StopIteration è un'eccezione integrata in Python che viene sollevata quando un iteratore è esaurito, ovvero non ci sono altri elementi da restituire.

Quando viene sollevata StopIteration?

L'eccezione StopIteration viene sollevata automaticamente da Python in due casi principali:

  1. Quando la funzione next() viene chiamata su un iteratore che non ha altri elementi.
  2. Quando il metodo __next__() di un iteratore personalizzato è implementato in modo da sollevare StopIteration al termine dell'iterazione.

Esempio di StopIteration

Vediamo come funziona StopIteration con un semplice iteratore:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # Salida: 1
print(next(my_iterator))  # Salida: 2
print(next(my_iterator))  # Salida: 3
print(next(my_iterator))  # Lanza StopIteration

In questo esempio, dopo aver iterato su tutti gli elementi di my_list, la chiamata successiva a next() solleva un'eccezione StopIteration.

Importanza nel comportamento degli iteratori

L'eccezione StopIteration è fondamentale per diversi motivi:

  1. Segnalare la fine: fornisce un segnale chiaro che l'iterazione è giunta al termine.
  2. Terminazione dei cicli For: i cicli for di Python si basano su StopIteration per sapere quando terminare.
  3. Controllo degli iteratori personalizzati: quando crei iteratori personalizzati, sollevare StopIteration ti consente di definire quando l'iterazione deve terminare.

Gestire StopIteration

Sebbene i cicli for gestiscano automaticamente StopIteration, quando usi direttamente next() potresti voler gestire esplicitamente questa eccezione:

my_iterator = iter([1, 2, 3])

try:
    while True:
        item = next(my_iterator)
        print(item)
except StopIteration:
    print("Iteration finished")

Questo codice stampa i numeri 1, 2 e 3, seguiti da "Iteration finished" quando viene intercettata l'eccezione StopIteration.

Comprendere l'eccezione StopIteration è essenziale per lavorare con gli iteratori in Python, poiché fornisce il meccanismo per controllare e terminare le iterazioni in modo standardizzato.

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 un iteratore personalizzato che generi una sequenza di numeri primi fino a un limite specificato. L'iteratore dovrebbe usare l'eccezione StopIteration per segnalare la fine della sequenza quando raggiunge o supera il limite.

Ti viene fornito quanto segue:

  • Un intero limit come input

Il tuo iteratore dovrebbe:

  • Generare numeri primi a partire da 2
  • Sollevare un'eccezione StopIteration quando il numero primo successivo supererebbe il limite specificato

Implementa l'iteratore come una classe con i metodi __iter__() e __next__(). Usa il metodo __next__() per generare il numero primo successivo e gestire l'eccezione StopIteration.

Stampa ogni numero primo 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 PrimeIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 2

    def __iter__(self):
        return self

    def __next__(self):
        # TODO: Implementa la logica per generare il prossimo numero primo
        # Se il prossimo numero primo supera il limite, solleva StopIteration
        # Restituisci il prossimo numero primo se rientra nel limite
        pass

# Crea un'istanza di PrimeIterator
prime_iter = PrimeIterator(limit)

# Itera sui numeri primi e stampa ciascuno di essi
try:
    for prime in prime_iter:
        print(prime)
except StopIteration:
    pass  # Fine dell'iterazione

Tutte le lezioni di Iteratori in Python

Esercitati da solo: Compilatore Python online