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 :
# 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 :
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 0renvoie 5 (car Vrai OU Faux donne Vrai : ici 5)3 and 2renvoie 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é siane contient pas une valeur nulle ou vide.
Ainsi, à la fin de ce script :
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
aprend soit la valeur 1, soit la valeur 2, il est tentant d'écrire :🐍 Script PythonQue comprend Python ici ? L'expression booléenneif a == 1 or 2: ...1 or 2vaut 1 donca == 1 or 2revient en fait àa == 1!
La bonne méthode est donc d'écrire :
if a == 1 or a == 2:
...
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)renvoieTrue. Ici,2vautTrue, donc(2 or 3)vaut2: Python n'évalue pas 3 ;3 == (2 or 3)renvoieFalse! En effet, puisque(2 or 3)vaut2, le test revient à3 == 2, ce qui est faux ;2 == (2 and 3)renvoieFalse. Ici,2vautTruedonc Python évalue3, qui vautTrueaussi, il renvoie doncTrue, ici 3, dernière valeur évaluée ;3 == (2 and 3)renvoie doncTrue.
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 :
while indice < len(tab) and tab[indice] != val:
indice = indice + 1
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).
Exercice
(Res)sources
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