Iteratori in Python

Iteratori in Python

Questo articolo spiega gli iteratori in Python.

YouTube Video

Iteratori in Python

Panoramica

In Python, un iteratore è un meccanismo fondamentale per elaborare gli elementi di collezioni come liste, tuple e dizionari uno alla volta.

Che cos'è un iteratore?

Un iteratore è un oggetto che può restituire elementi uno alla volta. In Python, un oggetto è considerato un iteratore se soddisfa le seguenti due condizioni:.

  • Ha un metodo __iter__() che restituisce se stesso.
  • Ha un metodo __next__() che restituisce l'elemento successivo. Genera StopIteration quando non ci sono più elementi.
1iterator = iter([1, 2, 3])
2print(next(iterator))  # 1
3print(next(iterator))  # 2
4print(next(iterator))  # 3
5# print(next(iterator))  # StopIteration occurs
  • In questo codice, la funzione iter() viene utilizzata per convertire una lista in un iteratore, e la funzione next() viene utilizzata per recuperare e visualizzare ogni elemento uno alla volta.

Differenza rispetto a Iterable

Un iterable è un oggetto che implementa il metodo __iter__() e può essere utilizzato in un ciclo for. Le liste e le tuple sono esempi di iterable.

1nums = [10, 20, 30]
2it = iter(nums)  # Get an iterator from the iterable
3print(next(it))  # 10
  • Questo codice è un esempio di come ottenere un iteratore da un oggetto iterabile come una lista e recuperare gli elementi in ordine utilizzando next().

Come verificare:

1from collections.abc import Iterable, Iterator
2
3nums = [10, 20, 30]
4it = iter(nums)
5
6print(isinstance(nums, Iterable))  # True
7print(isinstance(nums, Iterator))  # False
8print(isinstance(it, Iterator))    # True
  • Questo codice conferma che nums è un oggetto iterabile ma non un iteratore, mentre it, ottenuto usando iter(nums), è un iteratore.

Relazione tra cicli for e iteratori

Un ciclo for in Python funziona internamente come segue:.

1nums = [1, 2, 3]
2iterator = iter(nums)
3while True:
4    try:
5        value = next(iterator)
6        print(value)
7    except StopIteration:
8        break
  • Come mostrato, il ciclo for utilizza implicitamente un iteratore per eseguire l'iterazione.

Creazione di un iteratore personalizzato

È possibile creare un iteratore personalizzato utilizzando una classe.

 1class Countdown:
 2    def __init__(self, start):
 3        self.current = start
 4
 5    def __iter__(self):
 6        return self
 7
 8    def __next__(self):
 9        if self.current <= 0:
10            raise StopIteration
11        value = self.current
12        self.current -= 1
13        return value
14
15for num in Countdown(3):
16    print(num)  # 3, 2, 1
  • Questo codice definisce un iteratore personalizzato che fa il conto alla rovescia utilizzando la classe Countdown e stampa i numeri da 3 a 1 usando un ciclo for.

Differenza tra iteratori e generatori, e quando utilizzare ciascuno

I generatori offrono una funzionalità simile agli iteratori. Consentono di definire iteratori in modo più conciso.

1def countdown(n):
2    while n > 0:
3        yield n
4        n -= 1
5
6for i in countdown(3):
7    print(i)  # 3, 2, 1
  • Questo codice definisce una funzione generatrice che effettua un conto alla rovescia utilizzando yield e stampa i numeri da 3 a 1 usando un ciclo for.

Differenze tra iteratori (classe) e generatori (funzione)

Esistono le seguenti differenze tra iteratori (classi) e generatori (funzioni):.

Caratteristica Iteratore (classe) Generatore (funzione)
Definizione __iter__() + __next__() Funzione che utilizza yield
Gestione dello stato Gestione manuale degli attributi richiesta Mantiene automaticamente lo stato
Leggibilità Può diventare complessa Semplice e chiara
  • Differenza nel modo in cui sono definiti Un iteratore è definito scrivendo manualmente due metodi: __iter__() e __next__(). Al contrario, un generatore è semplicemente una funzione che utilizza la parola chiave yield, rendendo il codice molto più semplice.

  • Differenza nella gestione dello stato Con un iteratore, è necessario gestire manualmente lo stato corrente e l'avanzamento utilizzando variabili. I generatori, invece, mantengono automaticamente il loro stato internamente in Python, riducendo il lavoro manuale.

  • Leggibilità del codice Gli iteratori tendono a diventare complessi perché richiedono più metodi e una gestione manuale dello stato. Al contrario, i generatori utilizzano una sintassi semplice, rendendoli più facili da comprendere anche per i principianti.

Libreria standard per l'uso degli iteratori: itertools

itertools, una libreria standard di Python, offre potenti strumenti per lavorare con gli iteratori.

1import itertools
2
3for x in itertools.count(10, 2):  # 10, 12, 14, ...
4    if x > 20:
5        break
6    print(x)
  • Include anche molte altre funzioni come cycle, repeat, chain, islice e tee.

Casi d'uso per gli iteratori

I casi d'uso per gli iteratori includono quanto segue:.

  • Elaborazione delle righe di un file: Leggere le righe una per una da un file come iteratore.
  • Elaborazione efficiente in memoria: Elaborare grandi quantità di dati in modo sequenziale.
  • Rappresentazione di sequenze infinite: Usare funzioni come itertools.count().

Riepilogo

  • Un iteratore è un oggetto che può recuperare il valore successivo in modo sequenziale.
  • È possibile creare un iteratore personalizzato definendo __iter__() e __next__().
  • Vengono gestiti automaticamente tramite cicli for o la funzione next().
  • L'uso di generatori o itertools consente un'elaborazione più efficiente.

Utilizzando gli iteratori, è possibile elaborare grandi volumi di dati in modo sequenziale ed efficiente dal punto di vista della memoria, consentendo una gestione controllata dello stato e migliori prestazioni del programma.

Puoi seguire l'articolo sopra utilizzando Visual Studio Code sul nostro canale YouTube. Controlla anche il nostro canale YouTube.

YouTube Video