Programmation Python/Booléens
Définition
modifierUn booléen est un type de données qui ne peut prendre que deux valeurs : vrai ou faux. En Python, les constantes littérales sont notées True et False.
Tous les types de variables peuvent être interprétés de manière booléenne. Par exemple, pour les entiers (int), la valeur "0" correspond à "faux" et les autres valeurs à "vrai". Il en est de même pour tous les autres types : une valeur particulière vaut False et le reste des valeurs True. Le tableau suivant présente les valeurs "faux" pour les principaux type de données.
Exemple d'expressions booléennes
modifiera = 6
b = 7
c = 42
print(1, a == 6)
print(2, a == 7)
print(3, a == 6 and b == 7)
print(4, a == 7 and b == 7)
print(5, not a == 7 and b == 7)
print(6, a == 7 or b == 7)
print(7, a == 7 or b == 6)
print(8, not (a == 7 and b == 6))
print(9, not a == 7 and b == 6)
Affiche :
1 True 2 False 3 True 4 False 5 True 6 True 7 False 8 True 9 False
Que se passe-t-il ? Le programme consiste en un tas de print
. Chaque print
affiche un nombre et une expression. Le nombre sert à savoir de quel ligne on parle. Notez bien comme chaque expression finit soit par False
ou True
. En python False et True peuvent aussi être écrits 0 et 1.
And
modifierVoyez ce code :
print(1, a == 6)
print(2, a == 7)
Cela affiche respectivement a True
et a False
comme attendu, le premier est vrai, et le second est faux. La troisième ligne, print(3, a == 6 and b == 7)
, est un peu différente. L'opérateur and
signifie que si les deux expressions qui l'entourent sont vraies alors toute l'expression l'est également, autrement elle est fausse. Le comportement de and
peut être résumé comme suit :
Expression | Résultat |
---|---|
True and True
|
True |
True and False
|
False |
False and True
|
False |
False and False
|
False |
Notez que si la première expression est fausse Python ne vérifie pas la seconde car il sait que l'expression car il sait que tout l'expression est fausse. Essayez de lancer False and print("Salut")
et comparez le à True and print("Salut")
. Le terme technique pour ceci est short-circuit evaluation (littéralement "évaluation en circuit court").
Not
modifierLa ligne suivante, print(5, not a == 7 and b == 7)
, utilise l'opérateur not
. not
retourne l'opposé d'une expression (l'expression pourrait être réécrite print(5, a != 7 and b == 7)
). Voici la table de vérité :
Expression | Résultat |
---|---|
not True
|
False |
not False
|
True |
Or
modifierLes deux lignes suivantes, print(7, a == 7 or b == 7)
et print(7, a == 7 or b == 6)
utilisent l'opérateur or
. or
retourne vrai si la première expression est vraie ou si la seconde expression est vraie, si la seconde expression est vraie ou si les deux le sont. Si aucune n'est vraie il retourne faux. Voici sa table de vérité :
Expression | Résultat |
---|---|
True or True
|
True |
True or False
|
True |
False or True
|
True |
False or False
|
False |
Notez que si la première expression est vraie Python ne vérifie pas la seconde expression car il sait que toute l'expression est vraie. Cela marche car or
est vrai si au moins une des expressions est vraie. La première partie est vraie donc la seconde pourrait être vraie ou fausse, mais l'expression est toujours vraie.
Les deux lignes suivantes, print(8, not (a == 7 and b == 6))
et print(9, not a == 7 and b == 6
, montrent que les parenthèses peuvent être utilisées pour regrouper des expressions et forcer l’évaluation d'une partie en premier. Notez que les parenthèses ont changé l'expression de "faux" à "vrai". La raison est que les parenthèses ont forcé le not
à s'appliquer à toute l'expression au lieu de seulement la partie a == 7
.
bool()
modifierLa valeur booléenne d'une variable "x" peut être obtenue avec bool(x)
. Voici la table de vérité selon le type de la variable :
Vrai | Faux |
---|---|
True | False |
1 | 0 |
Nombre (positif ou négatif) | None |
Chaine non vide | Chaine vide |
Liste non vide | Liste vide |
Dictionnaire non vide | Dictionnaire vide |
Pour tester si une variable "x" n'est pas nulle, on utilise : not x is None
.
Note sur les opérateurs booléens
modifier
x == ('a' or 'b')
n'est pas équivalent à x == 'a' or x == 'b'
. En effet, cela ne vérifie pas si x
est équivalent aux caractères 'a'
ou 'b'
, car l'expression booléenne s'arrête avant la fin par short-circuit evaluation.
Exemple :
>>> 'a' == ('a' or 'b') # 'a' = True, donc ('a' or 'b') = 'a' sans avoir à évaluer 'b'. Ce qui revient à : 'a' == 'a'
True
>>> 'b' == ('a' or 'b') # Revient à : 'b' == 'a', de la même manière
False
>>> 'a' == ('a' and 'b') # 'a' = True et 'b' = True, donc ('a' and 'b') = 'b' (dernière expression évaluée). Ce qui revient à : 'a' == 'b'
False
>>> 'b' == ('a' and 'b') # Revient à : 'b' == 'b', de la même manière
True
Véracité/fausseté d'une expression
modifierLorsqu'un programme contient des instructions telles que while
ou if
, l'ordinateur qui exécute ce programme doit évaluer la véracité d'une condition, c'est-à-dire déterminer si une expression est vraie ou fausse. Par exemple, une boucle initiée par while c<20
: s'exécutera aussi longtemps que la condition c<20
restera vraie.
Mais comment un ordinateur peut-il déterminer si quelque chose est vrai ou faux ?
En fait - et vous le savez déjà - un ordinateur ne manipule strictement que des nombres. Tout ce qu'un ordinateur doit traiter doit d'abord toujours être converti en valeur numérique. Cela s'applique aussi à la notion de vrai/faux. En Python, tout comme en C, en Basic et en de nombreux autres langages de programmation, on considère que toute valeur numérique autre que zéro est « vraie ». Seule la valeur zéro est « fausse ». Exemple :
a = input('Entrez une valeur quelconque')
if a:
print("vrai")
else:
print("faux")
Le petit script ci-dessus n'affiche « faux » que si vous entrez la valeur 0. Pour toute autre valeur numérique, vous obtiendrez « vrai ».
Si vous entrez une chaîne de caractères ou une liste, vous obtiendrez encore « vrai ». Seules les chaînes ou les listes vides seront considérées comme « fausses ».
Tout ce qui précède signifie donc qu'une expression à évaluer, telle par exemple la condition a > 5 , est d'abord convertie par l'ordinateur en une valeur numérique. (Généralement 1 si l'expression est vraie, et zéro si l'expression est fausse). Exemple :
a = input('entrez une valeur numérique : ')
b = (a < 5)
print ('la valeur de b est', b, ':')
if b:
print("la condition b est vraie")
else:
print("la condition b est fausse")
Le script ci-dessus vous renvoie une valeur b = 1
(condition vraie) si vous avez entré un nombre plus petit que 5.
Ces explications ne sont qu'une première information à propos d'un système de représentation des opérations logiques de l’algèbre de Boole.
Exemple
modifierCréer le fichier password1.py :
#!/usr/bin/python
# -*- coding:Utf-8 -*-
# Ce programme demande à l'utilisateur son nom et son mot de passe, puis il les vérifie
name = input("What is your name? ")
password = input("What is the password? ")
if name == "Josh" and password == "Friday":
print("Welcome Josh")
elif name == "Fred" and password == "Rock":
print("Welcome Fred")
else:
print("I don't know you.")
Resultats :
What is your name? Josh What is the password? Friday Welcome Josh What is your name? Bill What is the password? Money I don't know you.
Exercices
Écrire un programme devine votre nom, avec seulement trois chances avant de terminer.
Solution
#!/usr/bin/python
# coding:Utf-8
print("Try to guess my name!")
count = 1
name = "guilherme"
guess = input("What is my name? ")
while count < 3 and guess.lower() != name: # .lower permet ici d'ignorer les majuscules dans le nom
print("You are wrong!")
guess = input("What is my name?")
count = count + 1
if guess.lower() != name:
print("You are wrong!")
print("You ran out of chances.")
else:
print("Yes! My name is", name + "!")