ProgrammazioneSviluppatore Python Backend/Junior

Spiega le sottigliezze del funzionamento dei cicli e degli operatori break/continue/else in Python. Come funziona else nel ciclo?

Supera i colloqui con l'assistente IA Hintsage

Risposta.

In Python è possibile scrivere else non solo dopo if, ma anche dopo i cicli for e while. Il corpo di else viene eseguito solo quando il ciclo si è concluso in modo "normale" — non tramite break. Questo consente di realizzare in modo elegante, ad esempio, la ricerca di un elemento.

Esempio:

for x in range(5): if x == 3: print('break!') break else: print('Il ciclo è terminato senza break') # non verrà eseguito
for x in range(5): if x == 10: break else: print('Il ciclo è terminato senza break') # verrà eseguito

Questa funzionalità è spesso utilizzata per "ricerche senza successo": se non è scattato il break, significa che l'elemento non è stato trovato.

Domanda trabocchetto.

Il blocco else del ciclo viene sempre eseguito se il ciclo è terminato? Cosa succede se il ciclo era vuoto?

Risposta: Sì, se non c'era il break, else verrà sempre eseguito, anche se il ciclo non è mai entrato nel corpo:

for x in []: print('niente') else: print('else!') # questo verrà stampato

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


Storia

Progetto: Parser di documenti.

Problema: Cercavano una chiave in una lista e dopo il ciclo impostavano un flag "not found" al di fuori di else. Di conseguenza, la rilevazione dell'elemento non funzionava correttamente se il break non si attivava.


Storia

Progetto: Generazione di token unici.

Problema: La logica di generazione del token dipendeva da un'uscita corretta tramite break, e else veniva erroneamente considerato un "caso speciale", anche se di fatto scattava nel 99% delle esecuzioni, il che rompeva la logica di autorizzazione degli utenti.


Storia

Progetto: Script di test per l'API di rete.

Problema: A causa di una comprensione errata di else dopo il while, lo utilizzavano per gestire i timeout, anche se il ciclo si era concluso non per break, e i timeout non venivano gestiti, il che portava a errori "silenziosi" nei test.