Cours de Python / Choisir un chemin avec if, elif et else

Une chaîne if–elif–else choisit un chemin d’exécution en examinant les conditions de haut en bas. Seule la première branche dont la condition est vraie s’exécute : définissez donc l’ordre des tests et leurs limites avant d’écrire le programme.

Délimiter les branches avec l’indentation

Écrivez un deux-points après la condition, puis indentez les instructions de cette branche. Quatre espaces par niveau constituent la convention habituelle. Les lignes d’une même branche doivent avoir la même indentation ; elif et else s’alignent sur leur if. Évitez de mélanger tabulations et espaces : un alignement visuel similaire peut cacher une indentation différente ou provoquer une erreur.

elif ajoute une condition à la même chaîne. else, facultatif et sans condition, traite les cas restants. Deux instructions if séparées sont indépendantes et peuvent toutes deux s’exécuter ; une chaîne if–elif sélectionne au maximum une branche. Utilisez la chaîne pour attribuer une catégorie unique, et des tests séparés pour des avertissements qui peuvent se cumuler.

Les conditions reposent sur les comparaisons et les opérateurs logiques Python. La documentation officielle de l’instruction if présente sa syntaxe et ses clauses.

Exécuter une classification complète

Ce programme utilise seulement Python 3. Enregistrez le bloc complet ci-dessous dans classify.py, en UTF-8, dans un dossier d’exercice. Ouvrez le terminal dans ce dossier avec l’environnement virtuel du projet activé, puis exécutez python classify.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 classify.py si votre interpréteur se nomme python3.

amount = 8000
if amount < 0:
    label = "invalid"
elif amount == 0:
    label = "free"
elif amount <= 10000:
    label = "small"
else:
    label = "large"
print(label)

Avec le montant initial de 8 000, le résultat attendu est :

small

invalid désigne un montant négatif, free le montant nul, small un montant positif inférieur ou égal à 10 000, et large un montant supérieur à 10 000. Ces mots sont des étiquettes de données conservées dans le programme. Le print(label) final reste sans indentation pour s’exécuter après la classification, quelle que soit la branche choisie.

Vérifier l’ordre des conditions et les frontières

Le premier test écarte les négatifs ; le deuxième écarte zéro. Lorsque Python atteint amount <= 10000, ces cas ont donc déjà été éliminés. Pour les montants entiers de cet exercice, cette troisième branche couvre 1 à 10 000 inclus. Avec des nombres décimaux, elle couvrirait aussi les valeurs positives entre zéro et un : choisissez le type numérique selon vos données.

Montant entier Étiquette attendue Raison
-1 invalid Strictement négatif
0 free Exactement nul
1 et 10000 small Intervalle positif, plafond inclus
10001 large Au-dessus du plafond

Placer amount <= 10000 en premier ferait aussi correspondre les négatifs et zéro ; leurs branches ne seraient plus atteintes. Un test large ne doit pas masquer un cas particulier à traiter différemment. Si le résultat paraît incohérent, cherchez d’abord quelle condition précédente a déjà capturé la valeur, plutôt que d’ajouter un niveau d’imbrication.

La classification suppose ici une donnée numérique valide. input() fournit une chaîne : la comparer directement à zéro déclenche une TypeError. Convertissez et validez la saisie avant la classification, et traitez séparément les conversions impossibles, par exemple int("huit") qui lève une ValueError. La leçon sur input(), les variables et print() explique cette frontière entre texte saisi et nombre.

Définir la variable sur tous les chemins

Chaque chemin possible doit attribuer une valeur à une variable utilisée ensuite. Dans ce programme, toutes les branches affectent label et le else couvre le reste. Si vous ne définissez result que lorsque la condition est vraie, l’afficher après un test faux peut provoquer une NameError dans un script où aucun autre result n’existe. Définissez une valeur par défaut avant le test ou affectez la variable dans chaque branche nécessaire.

À l’intérieur d’une fonction, une affectation à un nom le rend normalement local à cette fonction. Si un chemin lit cette variable avant qu’une valeur lui soit attribuée, l’erreur est une UnboundLocalError, sous-classe de NameError. Les règles officielles de résolution des noms précisent ce comportement.

  1. Remplacez uniquement la valeur de amount par chaque entrée du tableau, relancez le fichier et comparez l’étiquette attendue. Après chaque test, conservez les autres lignes inchangées.
  2. Fixez le montant à 10000, puis remplacez uniquement elif amount <= 10000: par elif amount < 10000:. Le résultat devient large. Rétablissez <= : il redevient small.
  3. Pour vérifier la différence entre tests indépendants et chaîne exclusive, comparez deux avertissements : « montant positif » et « montant supérieur à 5 000 ». À 8 000, les deux conditions sont vraies. Deux if peuvent afficher les deux avertissements ; remplacer le second par elif empêcherait le deuxième affichage.

Restaurez enfin amount = 8000 et le plafond inclusif. Le programme doit à nouveau afficher uniquement small. Gardez des tests de frontières en plus d’une valeur au milieu de l’intervalle : ils révèlent les oublis de branche et les changements de règle qui passeraient inaperçus avec 8 000 seul.