2.3.5 Tipi iteratori

Nuovo nella versione 2.2.

Python supporta il concetto di iterazione attraverso i contenitori, implementato usando due distinti metodi; questi vengono usati per consentire alle classi definite dall'utente il supporto all'iterazione. Le sequenze, descritte qui sotto con maggiore dettaglio, supportano sempre i metodi iterativi.

Un metodo ha bisogno di essere definito per contenere oggetti che forniscano il supporto iterativo:

__iter__( )
Restituisce un oggetto iteratore. L'oggetto viene richiesto per supportare il protocollo iterativo descritto qui sotto. Se un contenitore supporta differenti tipi di iterazione, metodi addizionali possono essere forniti per specifiche richieste di iteratori per quei tipi di iterazione. (Un esempio di un oggetto che supporti forme multiple di iterazione potrebbe essere una struttura ad albero, che supporta entrambi gli attraversamenti in ampiezza e profonditą.) Questo metodo corrisponde allo slot tp_iter del tipo di struttura per gli oggetti Python nelle API Python/C.

Gli stessi oggetti iteratori vengono richiesti per supportare i seguenti due metodi, che formano insieme il protocollo iteratore:

__iter__( )
Restituisce lo stesso oggetto iteratore. Viene richiesto per permettere sia ai contenitori che agli iteratori di essere usati con le istruzioni for e in. Questo metodo corrisponde allo slot tp_iter per il tipo di struttura per oggetti Python nelle API Python/C.

next( )
Restituisce l'elemento successivo del contenitore. Se non ci sono ulteriori elementi, viene sollevata un'eccezione di tipo StopIteration. Questo metodo corrisponde allo slot tp_iternext del tipo di struttura per gli oggetti Python nelle API Python/C.

Python definisce molti oggetti iteratori per supportare l'iterazione su tipi di sequenze generali e specifiche, dizionari, e altre forme pił specializzate. I tipi specifici non sono importanti, aldilą della loro implementazione del protocollo iteratore.

L'intenzione del protocollo č quella che quando un metodo iteratore next() solleva un'eccezione StopIteration, esso continuerą lo stesso in una chiamata successiva. Le esecuzioni che non obbediscono a questa proprietą vengono ritenute interrotte. (Questo vincolo č stato aggiunto in Python 2.3; in Python 2.2, i vari iteratori vengono interrotti secondo questa regola.)

I generatori di Python forniscono un modo conveniente per implementare il protocollo iteratore. Se il metodo dell'oggetto contenitore __iter__() viene implementato come un generatore, esso restituirą automaticamente un oggetto iteratore (tecnicamente, un oggetto generatore) sopperendo ai metodi __iter__() e next().

Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.