Les structures de contrôle

Les structures de contrôle permettent de créer des embranchements dans le flot d’exécution d’un programme. Python, comme la plupart des langages de programmation impératifs, prévoit des instructions pour représenter des décisions et des itérations.

L’indentation du code

Une structure de contrôle est associée à un bloc de code qui doit être ou non exécuté (structure de décision) ou répété (structure itérative). Comme pour le corps des fonctions, le code associée à une structure de contrôle est indiqué par l’indentation (généralement de quatre espaces supplémentaires à gauche).

Astuce

Une structure de contrôle doit contenir obligatoirement un bloc de code. Si vous voulez laisser le bloc vide, vous pouvez utiliser le mot-clé pass.

if a < 0:
    pass

Structures de décision

L’instruction if

La structure de décision if exécute un bloc de code si l’expression associée est évaluée à True.

if 'b' in 'bonjour':
    print ("La lettre b est présente dans le mot bonjour")

if 'z' not in 'bonjour':
    print ("La lettre z n'est pas présente dans le mot bonjour")
a = 0

if a < 2:
    a += 1

if a < 2:
    a += 1

if a < 2:
    a += 1

if a < 2:
    a += 1

print(a)
# affiche 2

Pour simplifier l’écriture, beaucoup de types peuvent directement s’évaluer comme une expression booléenne en python. Par exemple :

  • une variable ou un paramètre est équivalent à False s’il vaut None

  • un nombre est équivalent à True s’il est différent de 0

  • une chaîne de caractères est équivalente à True si elle n’est pas la chaîne vide ""

  • une liste, un ensemble, un dictionnaire ou un tuple est équivalent à True s’il n’est pas vide

a = None
if not a:
    print(a, "est équivalent à False")

a = 1
if a:
    print(a, "est équivalent à True")

a = "bonjour"
if a:
    print(a, "est équivalent à True")

a = []
if not a:
    print(a, "est équivalent à False")

L’instruction else

Il est possible d’ajouter un bloc else qui sera exécuté si la condition est évaluée à False :

a = 2
if a % 2:
    print(a, "est un nombre impair")
else:
    print(a, "est un nombre pair")

L’instruction elif

Si on souhaite représenter plusieurs alternatives, il est possible d’utiliser le mot-clé elif :

def get_mention(note):
    if note < 10:
        return "insuffisant"
    elif note <= 12:
        return "passable"
    elif note <= 14:
        return "assez bien"
    elif note <= 16:
        return "bien"
    else:
        return "trés bien"

Il est possible de créer des expressions booléennes complexes en les combinant grâce aux mots-clés and ou or ou en chaînant les opérateurs de comparaison :

a = 50
b = -2
if 0 <= a <= 100 and a % 2 and b < 2:
    pass

L’opérateur ternaire

Il est possible d’affecter une variable à partir d’une décision en l’exprimant sur une seule ligne :

a = 1
# msg vaut "impair" si a % 2 est différent de 0 sinon msg vaut "pair"
msg = "impair" if a % 2 else "pair"

Exercice

Exercice : comparaison à la moyenne

Écrivez un programme qui demande à l’utilisateur sa taille et son sexe (homme/femme) puis qui indique l’écart en centimètres par rapport à la moyenne en fonction de son sexe. On pourra utiliser comme moyenne 1m75 pour les hommes et 1m65 pour les femmes.

Structures itératives

Les structures itératives permettent de répéter un bloc de code.

L’instruction while

Avec l’instruction while, le bloc de code associé est répété tant que la condition est vraie.

reponse = None
while reponse != "oui":
    reponse = input("Voulez-vous arrêter ? (oui/non) ")

Prudence

Si la condition n’est jamais fausse, le bloc se répète à l’infini.

while True:
    print("ceci va continuer encore et encore...")

L’instruction for

L’instruction for permet de parcourir (itérer) tous les éléments * d’une liste.

ma_liste = ["premier", "deuxième", "troisième"]
for element in ma_liste:
    print(element)

Dans l’exemple ci-dessus la portée de la variable element est limitée au bloc de code associé à l’instruction for. La variable element prend successivement la valeur des éléments de la liste.

Il est également possible de parcourir tous les caractères d’une chaîne de caractères :

message = "Hello"
for l in message:
    print("caractère : ", l)

# Affiche :
# caractère : H
# caractère : e
# caractère : l
# caractère : l
# caractère : o

Note

De manière plus générale, il est possible de parcourir une séquence à l’aide de l’instruction for. Nous verrons dans les chapitres suivants d’autres types de séquence : le n-uplet (tuple), l’ensemble (set) et le dictionnaire (dict).

La fonction range

La fonction range permet de parcourir une liste de nombres. La méthode accepte :

  • un paramètre pour indiquer la borne supérieure (en commençant la liste à 0 et sans inclure la borne supérieure)

    for i in range(5):
        print(i)
    # Affiche
    #   0
    #   1
    #   2
    #   3
    #   4
    
  • deux paramètres pour indiquer l’intervalle avec le début et la fin (exclue)

    for i in range(3, 5):
        print(i)
    # Affiche
    #   3
    #   4
    
  • trois paramètres pour indiquer l’intervalle avec le début, la fin (exclue) et le pas d’incrément entre chaque valeur

    for i in range(1, 20, 2):
        print(i)
    # Affiche
    #   1
    #   3
    #   5
    #   7
    #   9
    #   11
    #   13
    #   15
    #   17
    #   19
    

    Il est possible de donner un pas négatif pour obtenir une suite décroissante :

    for i in range(5, 0, -1):
        print(i)
    # Affiche
    #   5
    #   4
    #   3
    #   2
    #   1
    

Interrompre un bloc d’itération

Il est possible d’utiliser les mots-clés break et continue pour interrompre l’exécution d’un bloc d’itération.

break

interrompt immédiatement le bloc et le flot d’exécution sort de la boucle et reprend après le bloc.

while True:
    if input("Voulez-vous arrêter ? (oui/non) ") == "oui":
        break
print("C'est fini.")
continue

interrompt immédiatement le bloc et on passe à l’itération suivante.

for l in "Python":
    if l in "aeiouy":
        continue
    print(l)

Structure itérative avec else

Il est possible d’utiliser une clause else après un while ou un for. Cette clause est exécutée lorsque l’expression de la condition while est fausse ou dès que la fin de la séquence à parcourir avec l’instruction for est atteinte.

L’intérêt du bloc else réside dans le fait qu’il n’est pas exécuté si l’itération a été interrompue par un break.

for i in range(10):
    if input("choisissez-vous le nombre %d ? (oui/non) " % i) == "oui":
        break
else:
    print("il fallait choisir un nombre... dommage")

Exercice

Exercice : calcul de la moyenne

Écrivez un programme qui demande à l’utilisateur de saisir une suite de nombres jusqu’à ce qu’il appuie directement sur Entrer.

Puis le programme affiche le tableau des chiffres donnés et ensuite le programme calcule et affiche la moyenne.

Exercice : le code de César

Le code de César est un algorithme de chiffrement classique, utilisé par Jules César dans ses correspondances secrètes. Il se base sur le principe du décalage. Une lettre est remplacée par son équivalent dans l’alphabet en effectuant un décalage. Le programme ci-dessous utilise un décalage de 23. Cela donne comme équivalence :

  • a → x

  • b → y

  • c → z

  • d → a

  • e → b

  • f → c

  • g → d

  • h → e

  • i → f

  • j → g

  • k → h

  • l → i

  • m → j

  • n → k

  • o → l

  • p → m

  • q → n

  • r → o

  • s → p

  • t → q

  • u → r

  • v → s

  • w → t

  • x → u

  • y → v

  • z → w

Ainsi la phrase :

In cryptography, a Caesar cipher is one of the simplest and most widely known encryption techniques.

sera encodée avec un décalage de 23 comme ceci :

Fk zovmqldoxmev, x Zxbpxo zfmebo fp lkb lc qeb pfjmibpq xka jlpq tfabiv hkltk bkzovmqflk qbzekfnrbp.

Écrivez un programme qui demande à l’utilisateur d’entrer une phrase. Puis le programme doit afficher la phrase chiffrée avec un décalage de 23 lettres.

Astuce

Vous pouvez, par exemple, vous aider des fonctions ord() et chr(). La première retourne le code d’un caractère et la seconde retourne un caractère à partir de son code.

Exercice : le code de César (pythonique)

Écrivez à nouveau le programme précédent mais en utilisant la fonction str.maketrans() pour créer une table de traduction. Utilisez ensuite la méthode str.translate() pour chiffrer la phrase saisie par l’utilisateur.

Vous pouvez trouver un exemple d’utilisation dans ce tutoriel.