PYTHON → ROBOTIQUE · 03

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 que 5 < 30 soit 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érateurSens
==é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

ABA and BA or B
TrueTrueTrueTrue
TrueFalseFalseTrue
FalseTrueFalseTrue
FalseFalseFalseFalse

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

MotDéfinition
ConditionExpression dont la valeur est True ou False.
Booléen (bool)Type des valeurs True et False.
BlocLignes indentées qui dépendent d’un if, else
IndentationDécalage de 4 espaces qui délimite un bloc.
Opérateur logiqueand, 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

Documentation

Tutoriel officiel : l’instruction if · Opérations booléennes

← Séance 02SommaireSéance 04 : Boucles →