Il protocollo di iterazione in Python ruota attorno all’uso di due funzioni chiave: `iter()` e `next()`. Anche se non esplicitamente si usano queste due funzioni in un normale script Python, sono alla base degli oggetti iterabili, come liste, tuple e dizionari.
Qui è come funziona:
1. Quando una funzione o metodo richiede un elenco di oggetti su cui lavorare, chiede in primo luogo un iteratore chiamando la funzione `iter()` sull’oggetto.
1. La funzione `iter()` restituisce un oggetto iteratore.
1. L’oggetto iteratore in questione è dotato di un metodo `__next__()` che restituisce il prossimo oggetto in sequenza.
1. Quando non ci sono più oggetti da restituire, l’oggetto iteratore genera un’eccezione `StopIteration`.
Un esempio di protocollo di iterazione potrebbe essere il seguente:
```
iterabile = [‘elemento1’, ‘elemento2’, ‘elemento3’]
iteratore = iter(iterabile)
while True:
try:
item = next(iteratore)
print(item)
except StopIteration:
break
```
Quindi, alla fine, il protocollo di iterazione in Python è l’interfaccia utilizzata per iterare su un oggetto, chiedendo un iteratore e poi usando `next()` per ottenere ogni oggetto della sequenza, fino a quando non termina con l’eccezione `StopIteration`.
Da notare anche che Python permette di personalizzare l’iterazione per i propri oggetti definendo i metodi `__iter__()` e `__next__()` nella classe dell’oggetto. Il metodo `__iter__()` dovrebbe restituire l’oggetto iteratore stesso. Il metodo `__next__()` dovrebbe restituire l’elemento successivo e dovrebbe sollevare `StopIteration` quando non ci sono più elementi.