ProgrammationDéveloppeur Python Backend/Junior

Expliquez les subtilités du fonctionnement des boucles et des opérateurs break/continue/else en Python. Comment fonctionne else avec la boucle ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

En Python, il est possible d’écrire else non seulement après if, mais aussi après les boucles for et while. Le corps de else s'exécute uniquement lorsque la boucle se termine de manière "normale" — pas avec break. Cela permet de réaliser de manière élégante, par exemple, la recherche d'un élément.

Exemple :

for x in range(5): if x == 3: print('break!') break else: print('La boucle s’est terminée sans break') # ne s'exécutera pas
for x in range(5): if x == 10: break else: print('La boucle s’est terminée sans break') # s'exécutera

Cette fonctionnalité est souvent utilisée pour "chercher sans succès": si le break ne s'est pas produit, cela signifie que l'élément n'a pas été trouvé.

Question piège.

Le bloc else de la boucle s'exécute-t-il toujours si la boucle se termine ? Que se passe-t-il si la boucle est vide ?

Réponse : Oui, s'il n'y a pas de break, else s'exécute toujours, même si la boucle n'est jamais entrée dans le corps :

for x in []: print('rien') else: print('else!') # cela sera affiché

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Projet : Parser de documents.

Problème : Nous cherchions une clé dans une liste, et après la boucle, nous définissions un drapeau "not found" en dehors du else. En conséquence, la détection de l'élément ne fonctionnait pas correctement si le break ne se produisait pas.


Histoire

Projet : Génération de jetons uniques.

Problème : La logique de génération du jeton dépendait d'une sortie correcte par break, et else était à tort considéré comme "cas exceptionnel", alors qu'en réalité il s'exécutait dans 99 % des cas, ce qui rompait la logique d'autorisation des utilisateurs.


Histoire

Projet : Script de test pour une API réseau.

Problème : En raison d'une compréhension incorrecte de else après while, nous l'avons utilisé pour traiter le timeout, alors que la boucle ne se terminait pas par break, et les timeouts n'étaient pas attrapés, ce qui entraînait des erreurs "silencieuses" dans les tests.