Retour au cours

Les intervalles

Supplément - Cours 4

Classer une valeur avec if, elif et else : l'ordre des tests change tout

Une valeur, trois zones

Un glucomètre mesure la glycémie à jeun, en g/L. Le programme doit dire si elle est :

  •  trop basse  : sous 0,7
  •  parfaite  : entre 0,7 et 1
  •  trop élevée  : au-dessus de 1

Les nombres sont rangés sur une droite : deux bornes (0,7 et 1) la coupent en trois intervalles. Le cylindre, c'est cette droite debout.

Trois intervalles, donc trois branches : un if, un elif et un else. Mais dans quel ordre les tester ?

Diapositive originale : cylindre de glycémie (élevé, normale, basse), ordre des tests numéroté et programme Python surligné
On teste d'abord élevé (1), puis basse (2). Ce qui reste est forcément normale (3) : c'est le else.
Diapositive originale : cylindre de glycémie (élevé, normale, basse), ordre des tests numéroté et programme Python surligné
On monte depuis le bas : basse (1), puis normale (2). Le elif glycemie < 1 n'a pas besoin de vérifier 0,7 : les basses sont déjà parties.
Diapositive originale : cylindre de glycémie (élevé, normale, basse), ordre des tests numéroté et programme Python surligné
On descend depuis le haut : élevé (1), puis normale (2). Ce qui reste en bas tombe dans le else (3).

Trois ordres, une même idée

Ordreifelifelse
les deux bouts, puis le milieuglycemie > 1glycemie < 0.7parfaite
du bas vers le hautglycemie < 0.7glycemie < 1trop elevee
du haut vers le basglycemie > 1glycemie > 0.7trop basse
  • Chaque test élimine un intervalle : un elif n'est lu que si tous les tests au-dessus de lui ont été faux.
  • C'est pourquoi chaque condition n'écrit qu'une seule borne, jamais 0.7 <= glycemie and glycemie <= 1.
  • Le else n'a pas de condition : il reçoit tout ce qui reste.

Le défi des bornes

Les trois programmes donnent-ils toujours la même réponse ? Prédisez, puis avancez.

glycemiebouts puis milieu> 1, < 0.7du bas< 0.7, < 1du haut> 1, > 0.7
0.69trop bassetrop bassetrop basse
0.7parfaiteparfaitetrop basse
0.85parfaiteparfaiteparfaite
1.0parfaitetrop eleveeparfaite
1.01trop eleveetrop eleveetrop elevee

Pile sur une borne, les trois programmes se contredisent ! Il faut décider à quel intervalle appartient 0,7 (et 1), puis choisir < ou <= en conséquence.

Choisir < ou <=

Décision : 0,7 et 1 sont des glycémies  parfaites  (intervalle 0,7 ≤ glycémie ≤ 1).

Du bas vers le haut

if glycemie < 0.7: message = "... trop basse" elif glycemie <= 1: message = "... parfaite" else: message = "... trop elevee"

Du haut vers le bas

if glycemie > 1: message = "... trop elevee" elif glycemie >= 0.7: message = "... parfaite" else: message = "... trop basse"

Truc : une borne incluse dans l'intervalle qu'on teste prend le = ; une borne qui appartient à l'intervalle suivant ne le prend pas.

Essayez : une valeur, trois programmes

glycemie = 0.85
message = "" if glycemie > 1: message = "Votre glycemie est trop elevee" elif glycemie < 0.7: message = "Votre glycemie est trop basse" else: message = "Votre glycemie est parfaite" print(message)
message = "" if glycemie < 0.7: message = "Votre glycemie est trop basse" elif glycemie < 1: message = "Votre glycemie est parfaite" else : message = "Votre glycemie est trop elevee" print(message)
message = "" if glycemie > 1: message = "Votre glycemie est trop elevee" elif glycemie > 0.7: message = "Votre glycemie est parfaite" else : message = "Votre glycemie est trop basse" print(message)

Les lignes allumées sont celles que Python lit ; la ligne encadrée est la branche exécutée. Essayez 0.7 et 1.

Le piège de l'ordre

On commence par le milieu...

if glycemie > 0.7: message = "... parfaite" elif glycemie > 1: message = "... trop elevee" else: message = "... trop basse"

Toute valeur plus grande que 1 est aussi plus grande que 0,7 : le if l'attrape, et le elif ne sera jamais lu.

glycemieobtenuattendu
0.5trop bassetrop bassecorrect
0.85parfaiteparfaitecorrect
1.3parfaitetrop eleveefaux !
2.4parfaitetrop eleveefaux !

Règle : partir d'un bout de la droite (le plus haut ou le plus bas), jamais du milieu.

À vous

D'autres valeurs, d'autres intervalles

Exercice #1 : la température du corps

Ce programme a un défaut

if temperature < 38: etat = "normale" elif temperature < 35: etat = "hypothermie" elif temperature < 40: etat = "fièvre" else: etat = "forte fièvre"

Qu'affiche-t-il pour chaque température ? Quel état ne sera jamais affiché ? Corrigez-le.

temperatureobtenuattendu
34.0normalehypothermie faux !
36.5normalenormale correct
39.0fièvrefièvre correct
41.0forte fièvreforte fièvre correct

Correction : monter depuis le bas : < 35 hypothermie, < 38 normale, < 40 fièvre, sinon forte fièvre.

Exercice #2 : l'indice UV

L'indice UV est un entier. Écrivez le programme deux fois : en partant du bas, puis en partant du haut.

0 à 23 à 56 et 78 à 1011 et plus
faiblemodéréélevétrès élevéextrême
if indiceUv <= 2: risque = "faible" elif indiceUv <= 5: risque = "modéré" elif indiceUv <= 7: risque = "élevé" elif indiceUv <= 10: risque = "très élevé" else: risque = "extrême"
if indiceUv >= 11: risque = "extrême" elif indiceUv >= 8: risque = "très élevé" elif indiceUv >= 6: risque = "élevé" elif indiceUv >= 3: risque = "modéré" else: risque = "faible"

La méthode en 4 étapes

Dessiner la droite (ou le cylindre) : placer les bornes et nommer chaque intervalle.
Choisir un bout : le plus bas ou le plus haut. Jamais le milieu.
Un if ou un elif par intervalle, une seule borne par condition ; le dernier intervalle va dans le else.
Tester pile sur chaque borne et décider : < ou <= ?

Pour continuer

R04 - Alternative généralisée

La note transformée en cote et le pH acide, neutre ou basique : d'autres intervalles, avec if, elif et else.

Ouvrir la version interactive du R04

Laboratoire #3

Catégorie d'âge, prix des billets de cinéma : appliquez la méthode des intervalles.

Ouvrir le laboratoire #3