13. Décider - if

Dans ce chapitre, nous allons voir comment un programme peut faire des choix, et comment il peut exécuter du code de façon sélective. Nous allons voir que :

  • le mot-clé if permet une exécution conditionnelle,

  • les mots-clés if-else permettent de choisir entre deux alternatives,

  • le mot-clé elif (else if) permet d’ajouter différentes conditions.

Question

En Python, if est suivi




Êtes-vous majeur ?

Basé sur votre âge, le programme exécute soit le premier bloc (if) soit le deuxième bloc (else). Il affiche si vous êtes majeur ou pas.

Comparer

Un programme doit parfois comparer deux valeurs. Python connait six types de comparaisons :

  • plus petit (<),

  • plus petit ou égal (<=),

  • égal (==),

  • différent (!=),

  • plus grand (>),

  • plus grand ou égal (>=).

Prudence

Il ne faut pas confondre l’opérateur d’affectation (x = 3) avec l’opérateur de comparaison (x == 2).

Le résultat d’une comparaison est une valeur booléenne, soit True soit False.

Voici quelques exemples :

Question

L’expression x == 2




Le signe d’un nombre

Le mot-clé elif est une contraction de else if et permet de continuer à tester d’autres conditions. Trouvez le signe d’un nombre.

Sans le mot-clé elif nous devrions mettre le bloc if à l’intérieur du bloc else en indentation. Avec multiples conditions, les blocs se décalent de plus en plus et rendent le programme illisible.

Exercice : Testez le programme avec -2, 0, 3.

Pair ou impair ?

La fonction modulo (x % 2) permet de décider si un nombre est pair ou impair. Le programme suivant affiche si le nombre que vous entrez est pair ou impair.

Pierre-papier-ciseaux

Le jeu pierre-papier-ciseaux est effectué avec les mains et oppose deux joueurs. Il possède de nombreux noms alternatifs, notamment en remplaçant certains mots comme « papier » par « feuille » ou « pierre » par « caillou ». Le terme chifoumi est également une appellation courante.

Pour le choix du jouer on pourrait lui faire entrer les mots pierre, papier, et ciseaux. Mais c’est plus simple si nous utilisons juste un nombre entier pour choisir une des trois options.

En interne, nous utilisons 1, 2, et 3 pour désigner les 3 choix. Dans un programme informatique, c’est plus efficace d’utiliser des entiers pour designer des choses. Pour l’utilisateur humain par contre, des mots sont plus compréhensibles. Nous utilisons un tuple pour faire la conversion d’un entier vers un mot. Comme l’indexage en Python commence toujours avec 0, nous devons décaler l’index de un avec l’expression [i-1].

Un grand avantage de séparer la logique abstraite du jeu, et les mots concrets, est qu’il devient très facile de traduire le jeu dans une autre langue. Par exemple, il suffit de changer le tuple objets en ('rock', 'paper', 'cissors') pour traduire en anglais, ou ('Stein', 'Papier', 'Schere') pour le traduire en allemand.

Tour de l’ordi

Pour jouer contre un ordinateur, nous avons besoin d’une fonction qui fait un choix aléatoire. Les fonctions aléatoires se trouvent dans le module random que nous importons au début. La fonction randint(a, b) renvoie un entier aléatoire dans l’intervalle [a, b].

Psychologiquement, le jeu se présente mieux quand il y a un petit délai entre notre réponse et la réponse de l’ordinateur. Nous utilisons la fonction sleep() du module time pour insérer un délai d’une seconde.

Décider qui gagne

Une fois le choix est fait par les deux joueurs (humain et ordinateur) nous devons décider qui va gagner. Nous pouvons représenter la situation pour l’humain avec ce tableau.

humain

pierre

papier

ciseaux

ordinateur

1

2

3

pierre

1

match nul

gagne

perd

papier

2

perd

match nul

gagne

ciseaux

3

gagne

perd

match nul

Avec les instructions conditionnelles if-elif-else nous pouvons décider alors qui gagne pour une combinaison donnée. Avec un choix judicieux, nous pouvons décider avec seulement 4 tests les 9 combinaisons différentes.

Jouer en boucle

Maintenant nous pouvons tout mettre dans une boucle pour jouer multiples fois. Dans la première ligne, nous indiquons le tour. Comme pour l’indexage des objets, quand nous affichons le nombre du tour, nous le décalons d’un avec l’expression n+1.

Décrire un chemin

Un programme de dessin avec la tortue est une séquence d’instructions. Si la tortue ne se déplace que sur les lignes d’une grille, nous pouvons représenter un chemin par une séquence d’actions où chaque action peut être représentée avec une seule lettre :

  • f = avancer

  • l = tourner à gauche

  • r = tourner à droite

Nous pouvons insérer des espaces dans chemin pour rendre la description plus lisible. Lors de l’exécution, ils ne sont pas pris en considération.

Exercice : Définissez et dessinez la lettre F.

Opérations logiques

Les opérateurs logiques permettent de combiner des valeurs logiques. En Python, nous avons :

  • et logique (and),

  • ou logique (or),

  • négation (not).

Pour tester si un nombre x est dans l’intervalle (a, b) il faut combiner deux comparaisons avec une opération logique.

L’opérateur not inverse la valeur logique :

  • True devient False,

  • False devient True.

Une double inversion revient à l’identité.

Dans l’exemple suivant, essayez de changer la valeur de p.

Dans un intervalle ?

Python permet de remplacer (a < x) and (x < b) par l’expression plus compacte a < x < b.

Exercices

  • Téléchargez l’exercice

  • Lancez un éditeur externe (tel que Thonny)

  • Depuis l’éditeur, ouvrez le fichier téléchargé

  • Remplacez … par votre code

  • Déposez vos exercices sur Moodle

Équation quadratique

En mathématiques, une équation quadratique est une équation polynomiale qui peut s’écrire sous la forme

\[ a x^2 + b x + c = 0 \]

Calculez d’abord le déterminant

\[ det = b^2 - 4 a c \]

Selon le déterminant vous avez 3 cas. Si le déterminant est :

négatif : pas de solution

zéro : une solution

\[ x = \frac{-b}{2a} \]

positif : deux solutions

\[ x_1 = \frac{-b + \sqrt{det}}{2a}, x_2 = \frac{-b - \sqrt{det}}{2a} \]

Écrivez un programme qui calcule la solution d’une équation quadratique.

Jeu multilangue

Adaptez le jeu pierre-papier-ciseaux pour qu’on puisse choisir la langue du jeu entre :

  • Français

  • Anglais

  • Allemand

Big Bang Theory

Une nouvelle variante de pierre-papier-ciseaux a été popularisée par la série américaine The Big Bang Theory. Il s’agit de Pierre-Papier-Ciseaux-Lézard-Spock. Ici, les règles classiques s’appliquent, mais il faut ajouter que le lézard mange le papier, empoisonne Spock, il est écrasé par la pierre et est décapité par les ciseaux. Spock vaporise la pierre, casse les ciseaux, et est discrédité par le papier.

Cette variante augmente le nombre de combinaisons de 3 à 10, et est censée réduire le nombre d’égalités entre deux joueurs qui se connaissent (bien qu’entre les personnages de la série, cette variante amène systématiquement à une égalité Spock vs. Spock).

humain

pierre

papier

ciseaux

lézard

Spock

ordinateur

1

2

3

4

5

pierre

1

nul

gagne

perd

perd

gagne

papier

2

perd

nul

gagne

gagne

perd

ciseaux

3

gagne

perd

nul

perd

gagne

lézard

4

gagne

perd

gagne

nul

perd

Spock

5

perd

gagne

perd

gagne

nul