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. GeneraStopIteration
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 funzionenext()
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, mentreit
, ottenuto usandoiter(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 ciclofor
.
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 ciclofor
.
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 chiaveyield
, 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
etee
.
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 funzionenext()
. - 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.