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 …

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 :

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 …

>>> "chien" and "chat"
"chat"
>>> 13 and 28
28

Analysons le premier cas :

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 :

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 :