Introduction au langage Python

Instruction conditionnelle

On a parfois besoin que certaines instruction ne s'exécutent que dans certains cas. Par exemple, dans le dernier exercice de la partie précédente, où l'on souhaite simuler le déplacement d'un mobile, il est intéressant de modifier la trajectoire en cas de collision (rebond). La proposition de correction contenanit en particuler des lignes telles que :

    if y>198: 
        y = 198
        v_y = -v_y
L'instruction if conditionne l’exécution d’un bloc de commandes.
  1. Le mot-clef if est suivi d'une condition.
  2. Le symbole : doit terminner cette première ligne.
  3. Les instructions conditionnées sont indentées.
if condition :
    instructions # indentées
# après : plus indenté 
L'instruction else peut être utilisée juste après le bloc suivant l'instruction if. Il permet, de la même façon, d'indiquer les instruction à exécuter quand la condition n'est pas réalisée.
if condition :
    instructions
else : # Ne pas oulier les :
    instructions

Exemple : Affichage de la parité d'un entier.

x = input("Entrer un entier : ")
x = int(x)
if x%2 == 0 : # == pour comparer à distinguer du = de l'affectation
    print(x,'est pair.')
else :
    print(x,'est impair.')
Exercice Recopier et compléter le programme ci-dessous pour que s'affiche si l'utilisateur est majeur ou mineur :
age = input('Quel est ton âge ? ')
age = int(age)
...
Une réponse classique, lisible et fonctionnelle :
age = input('Quel est ton âge ? ')
age = int(age)
if age < 18 :
    print('Tu es mineur')
else :
    print('Tu es majeur')
On cherche souvent à éviter au maximum la redondance d'écriture. On pourra alors proposer :
age = input('Quel est ton âge ? ')
age = int(age)
if age < 18 :
    categorie = 'mineur'
else :
    categorie = 'majeur'
print('Tu es',categorie)
En général, on évite de ne définir une variable que dans des blocs conditionnels si elle est utilisée en dehors de ces blocs. Il est préférable de faire une initialisation (en proposant la valeur par défaut).
age = input('Quel est ton âge ? ')
age = int(age)
categorie = 'majeur'
if age < 18 :
    categorie = 'mineur'
print('Tu es',categorie)

Imbrication

On peut impliquer plusieurs conditionnelles :

x = input("Entrer un chiffre : ")
if len(x)==1 and 48<=ord(x)<=57:  # Teste si x est un chiffre
    x = int(x)
    if x%2 == 0 :
        print(x,'est pair.')
    else :
        print(x,'est impair.')
else :
    print(x,'n\'est pas un chiffre.')
Exercice Une année est bissextile si elle est divisible par 4 mais pas par 100, avec une exception pour les années divisibles par 400 qui sont aussi bissextiles.

écrire la fonction bissextile pour qu'elle renvoie 'bissextile' ou 'non bissextile' selon que son paramètre entier donannt l'année. La tester avec les années 2000 et 2020 (bissextiles) et les années 2200 et 2022 (non bissextiles).

Il y a beaucoup de façons différentes d'écrire un programme répondant à cette question. En voici une :

def bissextile(annee):
    """ Renvoie 'bissextile' ou 'non bissextile' selon l'annee."""
    reponse = 'non bissextile'
    if annee%4==0 :
        if annee%100 != 0 :
            reponse = 'bissextile'
        if annee%400 == 0 :
            reponse = 'bissextile'
    return reponse #annee%4==0 and annee%100!=0 or annee%400==0

print(2000,bissextile(2000))
print(2020,bissextile(2020))
print(2200,bissextile(2200))
print(2022,bissextile(2022))

Disjonction

Quand on souhaite passer en revue différents cas disjoints, on peut utiliser l’imbrication, ou contracter else : if en elif. Ce dernier choix permet une relecture plus simple du code.

if q <= -1:
    print('non')
else :
    if -1 < q < 1 :
        print('0')
    else :
        if q == 1 :
            print('1')
        else :
            print('inf')
if q <= -1:
    print('non')
elif q < 1 :
    print('0')
elif q == 1 :
    print('1')
else :
    print('inf')
Exercice Écrire la fonction plus_longue, prenant deux chaines de caractères en paramètres, qui renvoie 1, ou 2 selon si c'est la première ou la seconde la plus longue, ou qui renvoie 0 si les deux ont la même longueur.
>>> plus_longue('je suis', 'il était')
2
Avec imbrication :
def plus_longue(x, y):
    """ Renvoie 1 ou 2 pour indiquer la chaine la plus longue, 
    ou 0 si elles ont la même longueur """
    reponse == 0
    if len(x) != len(y) :
        if len(x) > len(y)
            reponse = 1
        else : 
            reponse = 2
    return reponse
Par disjonction :
def plus_longue(x, y):
    """ Renvoie 1 ou 2 pour indiquer la chaine la plus longue, 
    ou 0 si elles ont la même longueur """
    reponse == 0
    if len(x) > len(y)
        reponse = 1
    elif len(x) < len(y) : 
        reponse = 2
    return reponse
Exercice Aux États-Unis, la majorité est à 18 ans dans presque tous les États et territoires, mais elle est à 19 ans au Nebraska et en Alabama et à 21 ans dans le Mississippi.
Écrire une fonction de deux paramètre, age : un entier et etat : une chaîne de caractères, qui renvoie 'majeur' ou 'mineur' selon à quoi correspond l'âge dans cet état.
>>> majeur(18,'Texax')
'majeur'
>>> majeur(18, 'Alabama')
'mineur'
Par exemple :
def majeur(age, etat):
    """ Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
    reponse = True
    if etat == 'Nebraska' or etat == 'Alabama' :
        if age < 19 :
            reponse = False
    elif etat == 'Mississippi' :
        if age < 21 :
            reponse = False
    else :
        if age < 18 :
            reponse = False
    return reponse
Avec un pré-traitement :
def majeur(age, etat):
    """ Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
    majorite = 18
    if etat == 'Nebraska' or etat == 'Alabama' :
        majorite = 19
    elif etat == 'Mississippia' :
        majorite = 21
    reponse = 'majeur'
    if age < majorite :
        reponse = 'mineur' 
    return reponse
En utilisant une structure de donnée pour le pré-traitement :
def majeur(age, etat):
    """ Renvoie 'majeur' ou 'mineur' selon l'age et l'état """
    majorite = {'Nebraska' : 19, 'Alabama' : 19, 'Mississippia' : 21}
    maj = majorite.get(etat, 18)  # 18 par défaut
    reponse = 'majeur'
    if age < majorite :
        reponse = 'mineur'
    return reponse

Expressions booléennes

Les "conditions" travaillées plus haut sont en fait des expressions booléennes, c'est à dire des formules logiques, qui évaluées, donnent deux valeurs possibles : True ou False.

Un booléen peut être fromé à partir d'opérateurs de comparaison :

>>> 1 == 2  # égaux
False
>>> 1 != 2  # différents
True
>>> 1 > 2
False
>>> 1 < 2
True
>>> 1 >= 2
False
>>> 1 <= 2
True
>>> 1 is 2  # même identifiant
False
>>> 1 is not 2
True
>>> 1 in {1, 2, 3}  # Appartient à
True
Attention à l'ordre lexicographique !
>>> 'b' < 'ab'
False
>>> '2' < '12'
False

Les opérateurs de comparaison peuvent être enchainés :

>>> x = 3
>>> 0 <= x < 10
True

On peut également utiliser les opérateurs logiques :

>>> not x == 3 
False
>>> x == 3 or x == 6
True
>>> x == 3 and x == 6
False
Mémo sur les priorités On peut utiliser le parenthésage pour forcer des priorités. Sinon, elles suivent l'ordre ci-dessous :
{} () [] . ** ~
(dictionnaire) (argument) (partie) (attribut) (puissance) (inversion de bit)
+ - * / // %
(positif) (négatif) (produit) (division) (quotient) (reste)
+ - << >> & ^
(somme) (soustraction) (décalage) (décalage) (et binaire) (ou exclusif)
| < > <= >= ==
(ou binaire) (inférieur strict) (supérieur strict) (inférieur) (supérieur) (égal)
!= is in not and or
(différent) (est) (appartient) (non) (et) (ou)
lambda
(expression lambda)

Pour s'entraîner

Exercice On souhaite programmer un jeu de dés. On lance 4 dés à 6 faces équilibrés et on marque 10 points pour un carré (4 valeurs identiques), 5 points pour un brelan (3 valeurs identiques) et 2 points par paire (2 valeurs identiques). Ainsi, un lancer permet de marquer 0, 2, 4, 5, ou 10 points.
On modélise un lancer par une chaîne ce caractères composée de 4 chiffres entre 1 et 6. Écrire la fonction score qui prend une telle chaîne comme paramètre et renvoie le score associé.
Quelques astuces pour présenter une réponse :
  • Utiliser des parenthèses autour de la condition permet de passer à la ligne pour un code plus lisible ($<80$ caractères par ligne).
  • On peut utiliser efficement des if et elif, selon si les cas s'exclus ou non.
  • Quand le bloc conditionnel se réduit à une instruction courte, on peut la positionner juste après les :.
  • Dans le cas du carré ou du brelan on peut donner directemnt se score. Dans le cas des paires, il faut bien les cumuler.
def score(lancer):
    """ lancer est un chaine de 4 caractères composée
    de chifrfes entre 1 et 6. La fonction renvoie
    le score correpond """ 
    points = 0
    if lancer[0]==lancer[1]==lancer[2]==lancer[3] :
        points = 10
    elif ( lancer[0]==lancer[1]==lancer[2] 
           or lancer[0]==lancer[1]==lancer[3] 
           or lancer[0]==lancer[2]==lancer[3] 
           or lancer[1]==lancer[2]==lancer[3] ) :
        points = 5
    else :
        if lancer[0]==lancer[1] : points = points + 2
        elif lancer[0]==lancer[2] : points = points + 2
        elif lancer[0]==lancer[3] : points = points + 2
        if lancer[1]==lancer[2] : points = points + 2
        elif lancer[1]==lancer[3] : points = points + 2
        if lancer[2]==lancer[3] : points = points + 2
    return points

print("3333 marque",score("3333"),"points")  # 10 points
print("3353 marque",score("3353"),"points")  # 5 points
print("3355 marque",score("3355"),"points")  # 4 points
print("3354 marque",score("3354"),"points")  # 2 points
print("3254 marque",score("3254"),"point")   # 0 point 

Navigation