Valeurs booléennes et opérateurs logiques
Introduction
Tout programme prend, à un moment ou un autre, des décisions : « si ce nombre est positif, faire ceci, sinon cela ». Ces décisions s'appuient sur des conditions, qui ne peuvent avoir que deux résultats : vrai ou faux.
Cette logique binaire, formalisée au XIXᵉ siècle par le mathématicien anglais George Boole, porte aujourd'hui son nom : on parle d'algèbre de Boole et de valeurs booléennes. Elle est partout en informatique — des tests d'égalité jusqu'aux portes logiques qui constituent physiquement le processeur.
En Python, ces deux valeurs s'écrivent True et False (avec une majuscule
initiale, c'est important).
Les trois opérateurs de base
L'algèbre de Boole repose sur trois opérateurs principaux. En Python, ils s'écrivent en toutes lettres.
| Opérateur logique | Python | Notation mathématique | Effet |
|---|---|---|---|
| ET | and | vrai si les deux opérandes sont vrais | |
| OU | or | vrai si au moins un des opérandes est vrai | |
| NON | not | inverse la valeur |
Sortie attendue :
False
True
False
False
Tables de vérité
Une table de vérité énumère toutes les combinaisons possibles des opérandes et donne la valeur du résultat. C'est l'outil de référence pour analyser une expression booléenne.
and (ET logique)
| Faux | Faux | Faux |
| Faux | Vrai | Faux |
| Vrai | Faux | Faux |
| Vrai | Vrai | Vrai |
or (OU logique)
| Faux | Faux | Faux |
| Faux | Vrai | Vrai |
| Vrai | Faux | Vrai |
| Vrai | Vrai | Vrai |
not (NON logique)
| Faux | Vrai |
| Vrai | Faux |
Le ou exclusif — xor
Il existe un quatrième opérateur très utile : le ou exclusif, noté xor
ou . Il vaut vrai si exactement un des opérandes est vrai (et donc
faux si les deux sont identiques).
| Faux | Faux | Faux |
| Faux | Vrai | Vrai |
| Vrai | Faux | Vrai |
| Vrai | Vrai | Faux |
Python ne fournit pas d'opérateur xor en toutes lettres pour les booléens,
mais on peut l'écrire avec != :
A, B = True, False
print(A != B) # True — équivaut à A xor B
Le xor est très utile pour l'addition binaire : sur 1 bit,
vaut 0 avec une retenue. C'est exactement ce dont a besoin un additionneur
matériel.
Quel opérateur retourne vrai uniquement si A et B sont différents ?
Expressions booléennes
On peut composer des expressions plus complexes en combinant and, or,
not. Comme en arithmétique, l'ordre des opérations compte :
notest appliqué en premier (priorité la plus haute).- Puis
and. - Puis
or(priorité la plus basse).
Exemple : pour évaluer True or False and not False, on lit dans cet ordre :
not False→TrueFalse and True→FalseTrue or False→True
if (age >= 18) and (permis or accompagnateur):
conduire()
Que vaut not (True or False) ?
Sans parenthèses, que vaut True or False and False (rappel : and est prioritaire sur or) ?
Le caractère séquentiel des opérateurs
Une particularité importante : Python évalue les opérateurs booléens de gauche à droite, et il s'arrête dès qu'il connaît le résultat. On parle d'évaluation paresseuse ou séquentielle.
- Pour
A and B: siAest faux, le résultat est forcément faux. Python ne va même pas évaluerB. - Pour
A or B: siAest vrai, le résultat est forcément vrai. Python ne va même pas évaluerB.
Cette propriété est exploitée comme une protection courante :
liste = []
# Sans court-circuit, on aurait une erreur en accédant à liste[0]
if liste and liste[0] > 5:
print("Premier élément grand")
Si liste est vide, liste est considéré comme faux, et Python ne tente même
pas d'évaluer liste[0] qui aurait planté.
Une application directe — l'addition binaire
L'addition de deux bits se décompose élégamment avec xor et and :
- Le bit de résultat est donné par
A xor B. - La retenue est donnée par
A and B.
| Somme = | Retenue = | ||
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |
C'est ce circuit minimal, appelé demi-additionneur, qu'on assemble pour construire l'additionneur complet d'un processeur. La logique booléenne n'est donc pas qu'abstraite : elle est gravée dans le silicium.
Pièges courants
- En Python,
TrueetFalseprennent une majuscule initiale.true(avec t minuscule) n'est pas une valeur valide. - Ne pas confondre
=(affectation) et==(test d'égalité) :x = 5met 5 dansx;x == 5teste sixvaut 5 et retourne un booléen. - Sans parenthèses,
not a == bse litnot(a == b), pas(not a) == b. - Les opérateurs
&,|,^existent aussi mais agissent bit à bit sur des entiers — c'est différent deand,or,xorsur des booléens.
Pour aller plus loin
Toute fonction logique, aussi complexe soit-elle, peut être réécrite
uniquement avec not, and et or (on parle d'ensemble fonctionnellement
complet). En électronique, l'opérateur nand (NON-ET) suffit à lui seul à
tout reconstruire — d'où son utilisation massive dans la conception des puces.