Aller au contenu

Les booléens en Python⚓︎

Expressions booléennes⚓︎

Il existe un type pour les booléens en Python, le type bool, les valeurs possibles sont True et False.

Les trois opérateurs de base sont and, or et not (and, or s'écrivent aussi & et |).

Exercice

Sans utiliser l'interpréteur Python, donnez les valeurs des expressions booléennes suivantes :

  • 2 < 5
  • 1 == 3
  • 4 != -1
  • 1 == 2 or 1 < 2
  • 8 in range(8)
  • 5 in [2, 3, 5, 7]
  • True and False
  • not (4 == 1 and 1 == 2)
  • not 4 == 1 and 1 == 2

Il est possible d'affecter la valeur d'une expression booléenne à une variable :

🐍 Script Python
# voici une fonction qui détermine si un nombre vaut 1
def test_egal_un(nb):
    resultat = (nb == 1) # cette ligne revient à : if nb == 1: resultat = True
    return resultat

La même fonction, en plus court :

🐍 Script Python
def test_egal_un(nb):
    return nb == 1
XOR en Python

En Python, la fonction XOR a un symbole qui lui est réservé : c'est ^.

C'est pourquoi les puissances se notent ** et non ^.

Valeurs vues comme des booléens⚓︎

Lors de tests, Python considère automatiquement comme valant False :

  • les valeurs nulles, par exemple, 0 ou 0.0 ;
  • les séquences ou chaînes de caractères vides, telles que '', (), [] ;
  • la valeur None

Toutes les autres valeurs sont convertibles en True.

Il est également possible d'utiliser des connecteurs logiques entre des valeurs autres non booléennes ! Ceci donne des choses surprenantes :

  • 5 or 0 renvoie 5 (car Vrai OU Faux donne Vrai : ici 5)
  • 3 and 2 renvoie 2 (car Vrai ET Vrai donne Vrai : Python renvoie le dernier True évalué, ici 2)
  • '' and [4] renvoie '' (car Faux et Vrai donne Faux : ici '')
  • if a:... sera vérifié si a ne contient pas une valeur nulle ou vide.

Ainsi, à la fin de ce script :

🐍 Script Python
a = 5
if a:
    a = 3

la variable a aura pour valeur 3.

Attention

Ceci peut être une source d'erreur. Voici deux exemples :

  • si une fonction est sensée renvoyer un booléen et qu'elle renvoie en fait une valeur quelconque, le programme ne fera pas ce qui est attendu ;
  • une erreur chez les débutants : voulant tester si une variable a prend soit la valeur 1, soit la valeur 2, il est tentant d'écrire :
    🐍 Script Python
    if a == 1 or 2:
        ...
    
    Que comprend Python ici ? L'expression booléenne 1 or 2 vaut 1 donc a == 1 or 2 revient en fait à a == 1 !

La bonne méthode est donc d'écrire :

🐍 Script Python
if a == 1 or a == 2:
    ...
ou, en plus Pythonesque :
🐍 Script Python
if a in [1, 2]:
    ...

Évaluation paresseuse⚓︎

Python lit de gauche à droite et ne calcule pas ce qui n'est pas nécessaire.

Par exemple, dans l'expression booléenne 5 == 3 and 1 == 1, le booléen 5 == 3 vaut False or Faux ET ... donne toujours Faux donc le booléen 1 == 1 n'est pas évalué.

De même, l'expression 5 == 3 and 1/0 == 0 (division par zéro !) ne causera pas d'erreur à l'exécution !

Encore une bizarrerie :

  • 2 == (2 or 3) renvoie True. Ici, 2 vaut True, donc (2 or 3) vaut 2 : Python n'évalue pas 3 ;
  • 3 == (2 or 3) renvoie False ! En effet, puisque (2 or 3) vaut 2, le test revient à 3 == 2, ce qui est faux ;
  • 2 == (2 and 3) renvoie False. Ici, 2 vaut True donc Python évalue 3, qui vaut True aussi, il renvoie donc True, ici 3, dernière valeur évaluée ;
  • 3 == (2 and 3) renvoie donc True.

Une remarque pour terminer : lors d'une recherche séquentielle d'une valeur val dans un tableau tab, nous pourrions en Python écrire la boucle :

🐍 Script Python
while indice < len(tab) and tab[indice] != val:
    indice = indice + 1
En effet, quand l'indice dépasse l'indice maximum, c'est-à-dire quand indice == len(tab) (le dernier indice acceptable est len(tab)-1), le booléen tab[indice] != val ne sera pas évalué et il n'y aura donc pas de risque de dépassement (sinon tab[len(tab)] déclencherait un IndexError: list index out of range).

(Res)sources

Stéphan Van Zuijlen

Wikipedia pour la plupart des illustrations.

SimcirJS pour le simulateur de circuit.

http://www.courstechinfo.be/MathInfo/FctLogiques1.html

https://isn-icn-ljm.pagesperso-orange.fr/1-NSI/res/res_activite_6_alg_boole.pdf

https://isn-icn-ljm.pagesperso-orange.fr/1-NSI/res/res_activite_7_boole_python.pdf

https://lesmathsduyeti.fr/fr/lycee/nsi-premiere/booleens-porte-logique/

https://isnbreizh.fr/nsi/activity/boolean/index.html

https://isnbreizh.fr/nsi/activity/condition/index.html

Et en bonus, une calculatrice d'expressions booléennes