Aller au contenu

1.3 Boucle While⚓︎

1. Premiers exemples⚓︎

À la différence essentielle des boucles for, dont on peut savoir à l'avance combien de fois elles vont être exécutées, les boucles while sont des boucles dont on ne sort que lorsqu'une condition n'est plus satisfaite.

Avec donc le risque de rester infiniment bloqué à l'intérieur !

image

Exemple fondateur n°1 ❤

Le programme suivant :

1
2
3
4
5
a = 0
while a < 3:
    print("ok")
    a = a + 1
print("fini")
va donner ceci :
ok
ok
ok
fini

Analyse grâce à PythonTutor

Question

le code ci-dessous va-t-il donner un résultat différent ?

1
2
3
4
5
a = 0
while a < 3:
    a = a + 1
    print("ok")
print("fini")

Résultat du programme ⏬
ok
ok
ok
fini

Conclusion : l'évaluation de la condition ne se fait pas à chaque ligne mais bien au début de chaque tour de boucle. Si la variable qui déclenchera la sortie de boucle atteint sa valeur de sortie au milieu des instructions, les lignes restantes sont quand même exécutées.

2. Syntaxe générale⚓︎

Écriture d'une boucle while

while condition:
    instruction1
    instruction2
        ...
    instructionN

2.1 La condition⚓︎

La condition est un booléen, c'est-à-dire une expression que Python évaluera à True ou à False.

Exemple de booléens résultant d'une évaluation :

>>> 1 < 3
True
>>> 5 > 7
False
>>> a = 10
>>> a > 8
True

Un cours sur les booléens aura lieu ici.

2.2 Les instructions⚓︎

Les instructions instruction1 jusqu'à instructionN sont exécutées dans cet ordre à chaque tour de boucle.

⚠ Attention : ces instructions doivent obligatoirement avoir un impact sur la condition évaluée après le while(dans le cours sur la dichotomie, nous évoquerons la notion de variant de boucle).

Voir le piège n°1 ...

3. Les pièges ...⚓︎

3.1 piège n°1 : ne JAMAIS SORTIR de la boucle⚓︎

Exemple fondateur n°2 ❤

Le programme suivant :

1
2
3
4
5
6
a = 0
while a < 3:
    print("ok")
    a = a + 1
    a = a * 0
print("ce texte ne s'écrira jamais")
va écrire une suite infinie de ok et ne jamais s'arrêter

3.2 piège n°2 : ne JAMAIS ENTRER dans la boucle⚓︎

Exemple fondateur n°3 ❤

Le programme suivant :

1
2
3
4
5
6
a = 0
while a > 10:
    print("ce texte non plus ne s'écrira jamais")
    a = a + 1

print("fini") 

va écrire fini et s'arrêter.

Exercice 1

Trouver le plus petit nombre entier \(n\) tel que \(2^n\) soit supérieur à 1 milliard.

1
2
3
4
5
n = 1
while 2**n < 10**9:
    n = n + 1
    print("trop petit")
print("trouvé : ",n)

4. Quelques remarques⚓︎

4.1 Lien entre while et for⚓︎

image

La boucle bornée for que nous avons étudiée est très pratique.

Mais nous pourrions nous en passer : toutes les boucles for peuvent en fait être ré-écrites en utilisant while. (alors que la réciproque est fausse)

Exercice 2

On considère le code ci-dessous :

1
2
for k in range(5):
    print("scooby-doo")
Ré-écrire ce code en utilisant une boucle while.

1
2
3
4
k = 0
while k < 5:
    print("scooby-doo")
    k = k + 1

4.2 Les boucles infinies volontaires⚓︎

image

La boucle infinie a été présentée comme un danger qu'il faut éviter.

Pourtant, dans quelques situations, il est d'usage d'enfermer volontairement l'utilisateur dans une boucle infinie.

C'est notamment le cas des codes Processing (ou p5) où la fonction draw() est une boucle infinie dont on ne sort que lorsqu'un évènement est intercepté (par exemple, le clic sur la fermeture de la fenêtre d'affichage).

Observez et exécutez le code suivant :

1
2
3
4
5
6
while True :
    reponse = input("tapez sur la lettre S du clavier pour me sortir de cet enfer : ")
    if reponse == 'S' or reponse == 's':
        break

print("merci, j'étais bloqué dans une boucle infinie")
  • le début du code : while True est typique des boucles infinies volontaires. On aurait tout aussi bien pu écrire while 3 > 2 (on rencontre même parfois des while 1)
  • vous avez découvert l'expression break qui comme son nom l'indique permet de casser la boucle (cela marche pour while comme pour for) et donc d'en sortir. Son emploi est controversé parmi les puristes de la programmation. Nous dirons juste que c'est une instruction bien pratique.

Exercice 3

Proposer un code qui choisit un nombre aléatoire entre 1 et 100, puis qui propose en boucle à l'utilisateur de le deviner, tant que celui-ci n'a pas trouvé.

On donnera à l'utilisateur des instructions "trop grand !" ou "trop petit !" pour le guider.

Aides :

  • int() permet de convertir une chaîne de caractères en nombre.
  • pour avoir un nombre a pseudo-aléatoire :
    from random import randint
    a = randint(1,10)
    
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from random import randint

mystere = randint(1, 100)

while True:
    reponse = int(input('quel est le nombre mystère ? '))
    if reponse > mystere:
        print('trop grand !')
    elif reponse < mystere:
        print('trop petit !')
    else:
        print('bravo !')
        break

Exercice 4

En vous basant sur l'exercice précédent, code un programme d'entraînement aux tables de multiplication de 1 à 10.