Séance 03 · Partie A · Python pas à pas
Conditions
et logique.
« Si l’obstacle est à moins de 20 cm, tourne. Sinon, avance. » Un robot n’est qu’une longue liste de décisions. Aujourd’hui on apprend à les écrire.
Durée : 60 à 90 min · Objectifs : if / elif / else, les booléens, les comparaisons, and / or / not, et raisonner avec une table de vérité.
Ce que vous saurez faire à la fin
- Écrire une condition simple, puis une condition à plusieurs branches.
- Combiner des conditions et prédire leur valeur.
- Comprendre l’indentation, la règle la plus importante de Python.
- Écrire le « cerveau » d’un robot simple qui réagit à des capteurs.
01 / if
Le si
if+ une condition +:- Le bloc décalé de 4 espaces ne s’exécute que si la condition est vraie.
- La dernière ligne n’est pas décalée : elle s’exécute toujours.
Changez distance en 40. Que s’affiche-t-il ?
L’indentation n’est pas de la décoration
Dans la plupart des langages (C, C++ sur Arduino…), un bloc est délimité par des accolades { }. En Python, c’est le décalage qui délimite le bloc. Quatre espaces, toujours (la touche Tab de l’éditeur intégré les insère). Un mélange d’espaces et de tabulations provoque IndentationError. Quand vous passerez au C sur Arduino, vous garderez l’habitude d’indenter : ce sera « seulement » pour la lisibilité, mais un code non indenté est illisible.
01 / if
Sinon : else
Exactement une des deux branches s’exécute. Jamais les deux, jamais aucune.
else n’a pas de condition : c’est « dans tous les autres cas ».
01 / if
Plusieurs cas : elif
- Python teste les conditions dans l’ordre et s’arrête à la première vraie.
- Avec
distance = 5, la première est vraie : les autres ne sont même pas regardées, bien que5 < 30soit aussi vrai. elif= « else if ». Autant que nécessaire.
Testez 5, 25, 60, 200.
Piège classique
Écrire les conditions dans le désordre. Si l’on met distance < 100 en premier, une distance de 5 déclenche « Avancer prudemment » et jamais le STOP. Règle : du plus précis au plus général, ou bien des bornes croissantes comme ici.
02 / Booléens
Vrai ou faux : le type bool
| Opérateur | Sens |
|---|---|
== | égal (deux signes !) |
!= | différent |
< > | strictement inférieur / supérieur |
<= >= | inférieur ou égal / supérieur ou égal |
= affecte, == compare. Confondre les deux est l’erreur n°1 des débutants.
Une comparaison est une valeur
3 < 5 n’est pas une question : c’est une expression qui vaut True. On peut la ranger dans une variable (est_proche = distance < 20), l’afficher, la passer à une fonction. Un if ne fait qu’examiner une valeur booléenne. En Python, True et False prennent une majuscule.
02 / Booléens
Combiner : and, or, not
| A | B | A and B | A or B |
|---|---|---|---|
| True | True | True | True |
| True | False | False | True |
| False | True | False | True |
| False | False | False | False |
and : les deux. or : au moins un. not : le contraire.
Pour aller plus loin — le « ou » du français est ambigu, pas celui de Python
« Fromage ou dessert » au restaurant signifie l’un ou bien l’autre (ou exclusif). Le or de Python est inclusif : vrai aussi quand les deux sont vrais. Le ou exclusif s’écrit A != B pour des booléens, ou A ^ B. Ces trois opérations (ET, OU, NON) suffisent à construire tout circuit numérique, y compris un processeur entier. C’est le théorème fondateur de l’électronique numérique, et les portes logiques d’un CPU ne font rien d’autre.
02 / Booléens
Priorités et parenthèses
Correction et loi de De Morgan
True, True, True, False, True, False, False. Ordre de priorité : not, puis and, puis or. Comme pour les nombres : au moindre doute, des parenthèses.
Les deux dernières lignes illustrent les lois de De Morgan : not (A and B) équivaut à (not A) or (not B), et not (A or B) équivaut à (not A) and (not B). Vous les retrouverez en maths (ensembles), en logique et en électronique. Vérifiez-les avec une table de vérité : c’est le premier « théorème » que vous pouvez démontrer par calcul exhaustif.
03 / Structure
Conditions imbriquées
Un if peut contenir un if. Chaque niveau ajoute 4 espaces.
Au-delà de deux ou trois niveaux, le code devient dur à lire. On préfère souvent combiner avec and :
if mode == "auto" and distance < 20:
print("Auto : évitement")
elif mode == "auto":
print("Auto : avance")
else:
print("Manuel")03 / Structure
Ce qui compte comme « vrai »
Règle
Sont considérés comme faux : 0, 0.0, la chaîne vide "", la liste vide [], None (« rien ») et bien sûr False. Tout le reste est vrai, y compris la chaîne "False" (c’est du texte non vide !). On écrit donc souvent if liste: pour dire « si la liste n’est pas vide ». (Le for est un aperçu de la séance 04.)
04 / Défis
Défi ★ — Le feu tricolore
Consigne
Demander la couleur d’un feu (« vert », « orange », « rouge ») et afficher l’action du robot : avancer, ralentir, s’arrêter. Si la couleur est inconnue, afficher un message d’erreur.
Correction
couleur = input("Couleur du feu ? ").lower()
if couleur == "vert":
print("Avancer")
elif couleur == "orange":
print("Ralentir")
elif couleur == "rouge":
print("S'arrêter")
else:
print(f"Couleur inconnue : {couleur}").lower() met en minuscules : « ROUGE » et « Rouge » sont alors acceptés. Penser à l’utilisateur qui ne tape pas comme vous l’imaginez est un réflexe d’ingénieur.
04 / Défis
Défi ★★ — Année bissextile
Consigne
Une année est bissextile si elle est divisible par 4, sauf si elle est divisible par 100, sauf si elle est divisible par 400. Demander une année et répondre. Tests : 2024 oui, 1900 non, 2000 oui, 2023 non.
Correction
annee = int(input("Année ? "))
bissextile = (annee % 4 == 0 and annee % 100 != 0) or annee % 400 == 0
if bissextile:
print(f"{annee} est bissextile")
else:
print(f"{annee} n'est pas bissextile")Remarquez qu’on range la condition dans une variable booléenne avec un nom clair. Le if devient lisible comme une phrase. Autre solution valable : une cascade de if / elif testant d’abord 400, puis 100, puis 4.
04 / Défis
Défi ★★★ — Esprit prépa : le triangle
Consigne
Demander trois longueurs a, b, c. Dire si elles peuvent former un triangle (chaque côté doit être strictement plus petit que la somme des deux autres). Si oui, préciser s’il est équilatéral, isocèle ou quelconque, et s’il est rectangle (théorème de Pythagore, attention aux flottants : comparer avec une tolérance).
Correction et ouverture
a = float(input("a ? "))
b = float(input("b ? "))
c = float(input("c ? "))
if not (a < b + c and b < a + c and c < a + b):
print("Pas un triangle")
else:
if a == b == c:
forme = "équilatéral"
elif a == b or b == c or a == c:
forme = "isocèle"
else:
forme = "quelconque"
# Le plus grand côté est l'hypoténuse potentielle
plus_grand = max(a, b, c)
somme_carres = a*a + b*b + c*c - plus_grand*plus_grand
rectangle = abs(somme_carres - plus_grand*plus_grand) < 1e-9
print(f"Triangle {forme}" + (", rectangle" if rectangle else ""))Trois idées à retenir : (1) tester d’abord le cas impossible pour se débarrasser des cas dégénérés ; (2) max() évite trois if pour trouver l’hypoténuse ; (3) on ne compare jamais deux flottants avec == après un calcul. Testez 3, 4, 5 puis 0.3, 0.4, 0.5. L’astuce a*a + b*b + c*c - max² donne la somme des carrés des deux petits côtés sans savoir lesquels ils sont : c’est le genre de raccourci qu’on attend en concours.
05 / Mini-projet
Le cerveau d’un robot en 20 lignes
À vous
Exécutez plusieurs fois : les capteurs changent. Ajoutez une règle : si les trois distances sont inférieures à 15, faire « marche arrière ». Où la placer pour qu’elle soit prise en compte ? Cette structure — lire les capteurs, décider, agir — est la boucle de base de tout robot. En séance 28 elle deviendra une machine à états, et sur Arduino vous l’écrirez en C.
06 / Vérification
Que vaut False and True or True ?
Deux questions supplémentaires
1. Que se passe-t-il avec if x = 5: ? Une SyntaxError : Python refuse une affectation dans un if. C’est une protection contre l’erreur classique (en C, cela compile et crée des bugs redoutables).
2. Combien de branches d’un if / elif / elif / else peuvent s’exécuter ? Exactement une.
Référence
Les mots à retenir
| Mot | Définition |
|---|---|
| Condition | Expression dont la valeur est True ou False. |
Booléen (bool) | Type des valeurs True et False. |
| Bloc | Lignes indentées qui dépendent d’un if, else… |
| Indentation | Décalage de 4 espaces qui délimite un bloc. |
| Opérateur logique | and, or, not. |
| Table de vérité | Tableau de tous les cas d’une expression logique. |
Pour continuer
Votre programme sait décider
Mais il ne décide qu’une fois, puis s’arrête. Un robot doit décider en permanence. Séance suivante : les boucles.
À faire chez soi
- Refaire les trois défis sans la correction.
- Écrire la table de vérité de
(A or B) and not (A and B). Quelle opération connue est-ce ? - Programme : demander une note sur 20 et afficher la mention (≥16 très bien, ≥14 bien, ≥12 assez bien, ≥10 passable, sinon insuffisant).
Documentation
Tutoriel officiel : l’instruction if · Opérations booléennes