L'istruzione for viene usata per iterare attraverso gli elementi di una sequenza (come una stringa, una tupla o una lista) o altri oggetti iterabili:
for_stmt |
::= | "for" target_list "in" expression_list
":" suite |
["else" ":" suite] |
L'espressione list viene valutata una volta; dovrebbe produrre una sequenza. La suite viene quindi eseguita una volta per ogni elemento nella sequenza, in ordine ascendente rispetto all'indice. Ogni elemento viene assegnato a turno alla lista obiettivo, usando le regole standard dell'assegnazione e quindi viene eseguita la suite. Quando gli elementi sono esauriti (quando la sequenza è vuota questo accade immediatamente), la suite nella clausola else, se presente, viene eseguita ed il ciclo termina.
Un'istruzione break eseguita nella prima suite finisce il ciclo senza eseguire le clausole else della suite. Un'istruzione continue eseguita nella prima suite salta il resto della suite e continua con l'elemento successivo, o con la clausola else se il prossimo elemento non esiste.
La suite può assegnare alla variabile (i) la lista obiettivo; questo non influenzerà l'elemento successivo assegnato alla stessa suite.
La lista obiettivo non viene cancellata quando il ciclo è finito, ma
se la sequenza è vuota, non verrà assegnata a nessuna variabile per
tutto il ciclo. Suggerimento: la funzione built-in range()
restituisce una sequenza di interi utilizzabili per emulare l'effetto
del Pascal for i := a to b do
; per esempio, range(3)
restituisce la lista [0, 1, 2]
.
C'è una finezza quando la sequenza viene modificata dal ciclo (questo può avvenire solamente per sequenze modificabili, per esempio nel caso di liste). Un contatore interno viene usato per tenere traccia del prossimo elemento usato e viene incrementato ad ogni iterazione. Quando questo iteratore ha raggiunto la lunghezza della sequenza il ciclo finisce. Questo significa che se la suite cancella l'elemento corrente (o il precedente) dalla sequenza, il prossimo elemento verrà saltato (fino a che non acquisisce l'indice dell'elemento corrente che è stato già trattato). In modo simile, se la suite inserisce un elemento nella sequenza prima dell'elemento corrente, l'elemento corrente verrà trattato ancora la prossima volta attraverso il ciclo. Questo può portare a bug fastidiosi che possono essere annullati facendo una copia temporanea dell'intera sequenza,per esempio,
for x in a[:]: if x < 0: a.remove(x)
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.