Table des matières
Aspect séquentiel des opérateurs logiques
Nous allons voir que Python – comme beaucoup de langages – ajoute un ingrédient dans les opérateurs and et or. Ce nouvel ingrédient ne change rien à ce que vous savez déjà, donc si ce qui suit vous parait trop compliqué – c'est assez compliqué… – ce n'est pas grave : C'est vraiment un tout petit détail, vous pouvez faire l'impasse dessus.
Nouvelle définition
or
Ancienne : a or b or c or … vrai si et seulement si au moins une des opérandes est vraie, faux sinon.
Nouvelle : a or b or c or …
- cherche la première opérande vraie,
- renvoie cette opérande et ne va pas plus loin si trouvée,
- sinon renvoie la dernière opérande.
Cela parait plus compliqué. Cela ne change rien tant que l'on a des booléens normaux. Mais justement, on a le droit d'utiliser or avec autre chose que des booléens !
>>> "chien" or "chat" "chien" >>> 13 or 28 13
Analysons le premier cas :
"chien" or "chat", Python identifie leor. Les textes"chien"et"chat"seront interprétés en tant que booléens,- Python lit le premier.
"chien", n'est pas un texte vide, est compris commeTrue. - Puisque Python a trouvé dans le
orun premier élémentTrue, il le renvoie et ne va pas plus loin. Mais Attention : Python ne renvoie pasTruemais l'opérande lui-même, c'est à dire"chien".
and
Ancienne : a and b and c and … faux si et seulement si au moins une des opérandes est fausse, vrai sinon.
Nouvelle : a and b and c and …
- cherche la première opérande fausse,
- renvoie cette opérande et ne va pas plus loin si trouvée,
- sinon renvoie la dernière opérande.
>>> "chien" and "chat" "chat" >>> 13 and 28 28
Analysons le premier cas :
"chien" and "chat", Python identifie leand. Les textes"chien"et"chat"seront interprétés en tant que booléens,- Python lit le premier.
"chien", n'est pas un texte vide, est compris commeTrue. - Python n'ayant pas trouvé False, il passe au suivant :
"chat". "chat"n'est pas vide non plus, donc compris commeTrue. Python passe au suivant.- Mais il n'y a pas de suivant. Python renvoie donc le dernier rencontré :
chat.
Quel intérêt ?
Cette nouvelle définition est beaucoup plus compliquée. Il faut qu'elle serve à quelque chose. Il y a deux grandes applications. Peut-être vous paraîtront-elles un peu maigre pour justifier de compliquer ainsi les choses. Mais ces astuces sont pourtant très très utilisées. Bien sûr, pour des débutants en programmation, on peut laisser tout cela de côté et y revenir plus tard.
Application 1 : évacuer les cas à problème
Supposons que L soit un sorte de liste d'éléments, par exemple L = [4, 17, 32, 25] et que l'on veuille comparer le premier et le dernier élément de cette liste. Dans le cas où le dernier est plus grand que le premier, on voudrait afficher “A augmenté” et sinon “N'a pas augmenté”.
Voilà une première approche :
if premier_element(L) < dernier_element(L):
print("A augmenté")
else:
print("N'a pas augmenté")
Mais L pourrait être vide, si bien que premier_element(L) déclencherait une erreur puisque si L est vide, elle n'a pas de premier élément…
On pourrait changer ainsi :
if not est_vide(L):
if premier_element(L) < dernier_element(L):
print("A augmenté")
else:
print("N'a pas augmenté")
else:
print("N'a pas augmenté")
C'est bien mais un peu lourd :
- imbrication de
if– que l'on pourrait éviter en utilisantelif, - deux fois le même
print.
On préfère ceci :
if not est_vide(L) and premier_element(L) < dernier_element(L):
print("A augmenté")
else:
print("N'a pas augmenté")
Ici, en ligne 1, si est_vide(L) est True, not est_vide(L) est False, ce qui interrompt l'évaluation du and qui renvoie False.
Comprenez bien : dans le cas ou L est vide, l'évaluation de la condition en ligne 1 ne va pas au bout. premier_element(L) n'est pas exécuté et il n'y a donc pas d'erreur.
Application 2 : Valeurs par défaut
Supposons que je demande à l'utilisateur de donner un nom au clavier. L'utilisateur est libre de donner un nom vide. Dans ce cas je souhaite imposer un nom par défaut. On pourrait faire ceci :
nom = input("Donnez un nom :")
if nom == "":
nom = "nom par défaut"
# suite du programme
Mais on aime faire ceci :
nom = input("Donnez un nom :") or "nom par défaut"
# suite du programme
Analysons ce qui se passe :
- Python évalue la parti droite de
=. - Python reconnaît un
or, il parcours les opérandes à la recherche d'une opérande vraie. - Python lit
input("Donnez un nom :")et l'exécute donc. - Premier cas, l'utilisateur répond quelque chose, par exemple
"Klein","Klein"est un texte non vide, compris commeTruedans ce cas.- Python n'a pas besoin d'aller plus loin dans l'évaluation du
or, il renvoie la valeur trouvée :"Klein" nomprend donc la valeur"Klein"
- Deuxième cas, l'utilisateur répond une chaîne vide
"",- La chaîne vide est comprise comme
Falsedans ce cas, - Python continue donc à parcourir les opérandes de
or, - Python lit
"nom par défaut"qui n'est pas vide, donc compris commeTrue, - Le
orrenvoie donc cette dernière opérande,"nom par défaut",
De toutes façons, c'est la dernière opérande. or ne pouvait pas aller plus loin. nomprend donc la valeur"nom par défaut"
