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 :

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

Analyse grâce à PythonTutor

Question

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

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

Résultat du programme ⏬
🐍 Script Python
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

🐍 Script Python
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 :

🐍 Script Python
>>> 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 :

🐍 Script Python
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 :

🐍 Script Python
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.

🐍 Script Python
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 :

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

🐍 Script Python
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 :

🐍 Script Python
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 10, puis qui propose en boucle à l'utilisateur de le deviner, tant que celui-ci n'a pas trouvé.

Aides :

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

mystere = randint(1, 10)

while True:
    reponse = int(input('quel est le nombre mystère ? '))
    if reponse == mystere:
        break
print('bravo !')