Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Comprendere gli Iteratori in Python | Padronanza di Iteratori e Generatori in Python
Programmazione Strutturale in Python

bookComprendere gli Iteratori in Python

Cosa sono gli Iterator?

Tecnicamente, in Python, un iterator è un oggetto che implementa il protocollo dell'iteratore, che consiste nei seguenti metodi:

  • __iter__(): restituisce l'oggetto iteratore stesso, rendendolo compatibile con cicli come for;
  • __next__(): restituisce il prossimo elemento nella sequenza. Quando non ci sono più elementi, solleva un'eccezione StopIteration per segnalare la fine della traversata.

Un iterator consente la traversata degli elementi in un iterable (ad esempio, una lista o una stringa) uno alla volta, mantenendo traccia della posizione.

iterator = iter(iterable)

Nota

Un iterator è anche un iterable perché implementa il metodo __iter__().

Non tutti gli iterable sono iterator. Ad esempio, una lista è iterable ma non è un iterator. Quando la passi alla funzione iter(), ottieni un iterator che consente la traversata elemento per elemento.

Creazione di un Iterator Personalizzato

Questo iterator genera un numero fisso di lanci di dado casuali e si interrompe una volta completati tutti i lanci.

123456789101112131415161718192021222324252627
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
copy

Esaurimento dell'Iteratore

Una volta che un iteratore è esaurito, non può essere riutilizzato senza essere ricreato. Ad esempio:

12345678910
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
copy

Gli iteratori possono essere attraversati solo una volta. Per iterare nuovamente, è necessario creare un nuovo iteratore.

Compito

Swipe to start coding

Completa le parti mancanti del codice per implementare una classe iteratore personalizzata che simuli un lanciatore di dadi infinito. L'iteratore deve generare pigramente lanci casuali di un dado a sei facce e fermarsi dopo 10 lanci.

  1. Il metodo __iter__() consente a un oggetto di essere utilizzato come iteratore.
  2. Il metodo __next__() produce il prossimo lancio casuale del dado (un numero tra 1 e 6).
  3. Crea un'istanza della classe InfiniteDie, che rappresenta il lanciatore di dadi.
  4. Utilizza un ciclo for con enumerate() per lanciare il dado in modo pigro. Interrompi dopo 10 lanci usando una condizione if e l'istruzione break.

Soluzione

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 2
single

single

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

close

bookComprendere gli Iteratori in Python

Scorri per mostrare il menu

Cosa sono gli Iterator?

Tecnicamente, in Python, un iterator è un oggetto che implementa il protocollo dell'iteratore, che consiste nei seguenti metodi:

  • __iter__(): restituisce l'oggetto iteratore stesso, rendendolo compatibile con cicli come for;
  • __next__(): restituisce il prossimo elemento nella sequenza. Quando non ci sono più elementi, solleva un'eccezione StopIteration per segnalare la fine della traversata.

Un iterator consente la traversata degli elementi in un iterable (ad esempio, una lista o una stringa) uno alla volta, mantenendo traccia della posizione.

iterator = iter(iterable)

Nota

Un iterator è anche un iterable perché implementa il metodo __iter__().

Non tutti gli iterable sono iterator. Ad esempio, una lista è iterable ma non è un iterator. Quando la passi alla funzione iter(), ottieni un iterator che consente la traversata elemento per elemento.

Creazione di un Iterator Personalizzato

Questo iterator genera un numero fisso di lanci di dado casuali e si interrompe una volta completati tutti i lanci.

123456789101112131415161718192021222324252627
import random class FiniteDie: def __init__(self, num_rolls): """Initialize the iterator with a fixed number of rolls.""" self.num_rolls = num_rolls self.current_roll = 0 def __iter__(self): """Return the iterator object itself.""" return self def __next__(self): """Generate the next dice roll or stop iteration.""" if self.current_roll < self.num_rolls: self.current_roll += 1 return random.randint(1, 6) raise StopIteration # Using the FiniteDie iterator num_rolls = 5 die_iterator = FiniteDie(num_rolls) print(f"Rolling the die {num_rolls} times:") for roll in die_iterator: print(f"Rolled: {roll}")
copy

Esaurimento dell'Iteratore

Una volta che un iteratore è esaurito, non può essere riutilizzato senza essere ricreato. Ad esempio:

12345678910
numbers = [1, 2, 3, 4] iterator = iter(numbers) # First iteration for num in iterator: print(num) # Output: 1, 2, 3, 4 # Second iteration for num in iterator: print(num) # Output: Nothing, the iterator is exhausted.
copy

Gli iteratori possono essere attraversati solo una volta. Per iterare nuovamente, è necessario creare un nuovo iteratore.

Compito

Swipe to start coding

Completa le parti mancanti del codice per implementare una classe iteratore personalizzata che simuli un lanciatore di dadi infinito. L'iteratore deve generare pigramente lanci casuali di un dado a sei facce e fermarsi dopo 10 lanci.

  1. Il metodo __iter__() consente a un oggetto di essere utilizzato come iteratore.
  2. Il metodo __next__() produce il prossimo lancio casuale del dado (un numero tra 1 e 6).
  3. Crea un'istanza della classe InfiniteDie, che rappresenta il lanciatore di dadi.
  4. Utilizza un ciclo for con enumerate() per lanciare il dado in modo pigro. Interrompi dopo 10 lanci usando una condizione if e l'istruzione break.

Soluzione

Switch to desktopCambia al desktop per esercitarti nel mondo realeContinua da dove ti trovi utilizzando una delle opzioni seguenti
Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 6. Capitolo 2
single

single

some-alt