Aller au contenu

Partie 4 : Booléens et expressions booléennes


Le mathématicien anglais George Boole (1815-1864) a développé une algèbre permettant de formaliser le raisonnement logique avec seulement deux valeurs : vrai et faux. Cette algèbre, devenue l'algèbre de Boole, est le fondement de toute l'informatique moderne.

Un booléen est un type de donnée qui ne peut prendre que deux valeurs :

Valeur logiqueEn PythonEn binaire
VraiTrue1
FauxFalse0

En Python, le type booléen s'appelle bool :

>>> type(True)
<class 'bool'>
>>> type(False)
<class 'bool'>

Les opérateurs de comparaison renvoient des booléens :

>>> 5 > 3
True
>>> 10 == 7
False
>>> "alice" != "bob"
True
>>> 4 <= 4
True
OpérateurSignification
==Égal à
!=Différent de
<Strictement inférieur
>Strictement supérieur
<=Inférieur ou égal
>=Supérieur ou égal

L'opérateur not inverse une valeur booléenne : vrai devient faux, et faux devient vrai.

Table de vérité :

anot a
01
10
>>> not True
False
>>> not False
True
>>> not (5 > 3)
False

L'opérateur and renvoie True uniquement si les deux opérandes sont vrais. Il suffit qu'un seul soit faux pour que le résultat soit faux.

Table de vérité :

aba and b
000
010
100
111
>>> True and True
True
>>> True and False
False
>>> (5 > 3) and (10 < 20)
True
>>> (5 > 3) and (10 > 20)
False

L'opérateur or renvoie True si au moins un des opérandes est vrai. Il ne renvoie False que si les deux sont faux.

Table de vérité :

aba or b
000
011
101
111
>>> False or True
True
>>> False or False
False
>>> (5 > 10) or (3 < 7)
True

Le ou exclusif (noté XOR ou ⊕) renvoie True si exactement un des deux opérandes est vrai, mais pas les deux.

Table de vérité :

aba XOR b
000
011
101
110

La différence avec le or est visible sur la dernière ligne : 1 XOR 1 = 0.

En Python, le XOR s'écrit avec l'opérateur ^ (sur les entiers) :

>>> 1 ^ 0
1
>>> 1 ^ 1
0
>>> True ^ True
False
>>> True ^ False
True

Pour une expression booléenne complexe, on construit sa table de vérité en listant toutes les combinaisons possibles des variables d'entrée.

Ces deux équivalences sont très utiles pour simplifier des expressions :

  • not (a and b) = (not a) or (not b)
  • not (a or b) = (not a) and (not b)

En termes simples : quand on « distribue » un not sur un and ou un or, l'opérateur s'inverse.


Python évalue les expressions booléennes de gauche à droite et s'arrête dès que le résultat est déterminé. C'est l'évaluation paresseuse (ou évaluation en court-circuit).

Si le premier opérande est False, Python sait que le résultat sera False quel que soit le second opérande. Il ne l'évalue pas.

>>> False and (1 / 0 > 0) # pas d'erreur de division par 0 !
False

La division par zéro n'est jamais exécutée car Python s'arrête après avoir évalué False.

Si le premier opérande est True, Python sait que le résultat sera True quel que soit le second opérande.

>>> True or (1 / 0 > 0) # pas d'erreur non plus !
True

L'évaluation paresseuse est très utile pour écrire des conditions de sécurité :

def element_existe(liste, index):
"""Vérifie si l'élément à l'index donné existe et vaut 0."""
if index < len(liste) and liste[index] == 0:
return True
return False

Si index dépasse la taille de la liste, le and court-circuite et liste[index] n'est jamais évalué : on évite une erreur IndexError.


Les opérations booléennes sont au fondement des circuits électroniques des processeurs. L'addition de deux bits illustre ce lien.

L'addition de deux bits A et B produit :

  • Une somme S ;
  • Une retenue R (en anglais carry).
ABSomme (S)Retenue (R)
0000
0110
1010
1101

En comparant avec les tables de vérité :

  • S = A XOR B (la somme vaut 1 quand les bits sont différents) ;
  • R = A AND B (la retenue vaut 1 quand les deux bits valent 1).

C'est ainsi que les processeurs additionnent les nombres : avec des portes logiques XOR et AND connectées entre elles.

Additionnons (1011)2(1011)_2 et (0110)2(0110)_2 (soit 11 + 6 = 17) :

retenues : 1 1 1 0
1 0 1 1 (11)
+ 0 1 1 0 (6)
---------
1 0 0 0 1 (17)

Le procédé est identique à l'addition en décimal, mais les retenues se propagent dès que la somme dépasse 1.


OpérateurPythonDescriptionRésultat = 1 si...
NONnot aNégationa est faux
ETa and bConjonctiona et b sont tous les deux vrais
OUa or bDisjonctionAu moins un des deux est vrai
XORa ^ bOu exclusifExactement un des deux est vrai
PropriétéDétail
Lois de De Morgannot (a and b) = (not a) or (not b) et inversement
Évaluation paresseusePython s'arrête dès que le résultat est déterminé
Addition binaireSomme = XOR, Retenue = AND
Table de véritéAvec n variables, il y a 2ⁿ lignes