Python Language Loop con una clausola "else"


Esempio

Le dichiarazioni for e while (loop) possono facoltativamente avere una clausola else (in pratica, questo utilizzo è piuttosto raro).

La clausola else viene eseguita solo dopo che un ciclo for termina eseguendo il iterazione fino al completamento o dopo che un ciclo while termina con la sua espressione condizionale che diventa false.

for i in range(3):
    print(i)
else:
    print('done')

i = 0
while i < 3:
    print(i)
    i += 1
else:
    print('done')

produzione:

 0
 1
 2
 done

La clausola else non viene eseguita se il ciclo termina in un altro modo (attraverso un'istruzione break o sollevando un'eccezione):

for i in range(2):
    print(i)
    if i == 1:
        break
else:
    print('done')

produzione:

0
1

La maggior parte degli altri linguaggi di programmazione mancano di questa facoltativa else clausola di loop. L'utilizzo della parola chiave else , in particolare, è spesso considerata fonte di confusione.

Il concetto originale di tale clausola risale a Donald Knuth e il significato della parola chiave else diventa chiaro se riscriviamo un ciclo in termini di istruzioni if e istruzioni goto dei giorni precedenti alla programmazione strutturata o da un linguaggio assembly di livello inferiore.

Per esempio:

while loop_condition():
    ...
    if break_condition():
        break
    ...

è equivalente a:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>

<<end>>:

Rimangono equivalenti se alleghiamo una clausola else .

Per esempio:

while loop_condition():
    ...
    if break_condition():
        break
    ...
else:
    print('done')

è equivalente a:

# pseudocode

<<start>>:
if loop_condition():
    ...
    if break_condition():
        goto <<end>>
    ...
    goto <<start>>
else:
    print('done')

<<end>>:

Un ciclo for con una clausola else può essere compreso allo stesso modo. Concettualmente, esiste una condizione di loop che rimane True fintanto che l'oggetto o la sequenza iterabili ha ancora alcuni elementi rimanenti.

Perché dovremmo usare questo strano costrutto?

Il caso d'uso principale per il costrutto for...else è un'implementazione concisa della ricerca, ad esempio:

a = [1, 2, 3, 4]
for i in a:
    if type(i) is not int:
        print(i)
        break
else:
    print("no exception") 

Per rendere il else in questo costrutto meno confuso, si può pensare ad esso come " se non si rompe " o " se non si trova ".

Alcune discussioni su questo argomento possono essere trovate in [Python-ideas] Riepilogo di ... altri thread , perché python usa 'else' after for e while loops? e Else Clauses su Loop Statements