Boucle while

Denis Dréano
PROG4-02

Boucle while

Objectifs cantonaux : O1.6. Semaine dédoublée (×2, groupes A/B séparés).

Cours complet sur la plateforme Runestone de Cédric Donner : Boucle conditionnelle : while.

Jusqu’ici, vous avez toujours connu à l’avance le nombre de répétitions d’une boucle (for _ in range(n)). Il arrive souvent qu’on ne le connaisse pas — par exemple, dessiner une spirale jusqu’à ce qu’un côté dépasse une certaine taille. C’est le rôle de la boucle while (« tant que »).

Syntaxe

◈ Syntaxe — Boucle while

while expression_conditionnelle:
    bloc_instructions

À chaque itération, Python vérifie la condition :

  • Si elle est vraie, Python exécute le bloc et revient vérifier la condition.
  • Si elle est fausse, Python n’entre pas (ou plus) dans la boucle et passe à la suite du programme.

Autrement dit, while est une sorte de if qui se répète.

→ Exemple 1 — spirale jusqu’à une taille maximale
from gturtle import *

def spirale(cote_initial, facteur, cote_max):
    cote = cote_initial
    while cote < cote_max:
        forward(cote)
        right(90)
        cote *= facteur

speed(10)
spirale(50, 1.2, 250)

On ne sait pas à l’avance combien de côtés seront dessinés — cela dépend de la vitesse à laquelle cote grandit. La boucle for ne convient pas ici : il faudrait deviner un nombre de répétitions.

Transformer une boucle for en boucle while

▷ À retenir — Variable de contrôle

N’importe quelle boucle for peut s’écrire avec un while, à condition d’introduire une variable de contrôle (souvent nommée i) qui compte les répétitions déjà effectuées.

→ Exemple 2 — équivalence for / while
# Boucle for
for i in range(5):
    print(i, "ième itération (for)")

# Boucle while équivalente
i = 0
while i < 5:
    print(i, "ième itération (while)")
    i += 1

! Boucle infinie

N’oubliez jamais d’incrémenter la variable de contrôle à la fin de la boucle. Sans cela, la condition reste vraie pour toujours et le programme ne s’arrête jamais (boucle infinie — le programme plante ou il faut l’arrêter de force avec le bouton « stop »).

total = 0
n = 1
while n <= 100:
    total += n          # n n'est jamais incrémenté !
print(total)             # cette ligne n'est jamais atteinte

Version corrigée :

total = 0
n = 1
while n <= 100:
    total += n
    n += 1
print(total)

Exercice 1 — spirale octogonale

Développez une commande spirale(angle, cote_initial, decr, cote_min) qui dessine une spirale allant de l’extérieur vers l’intérieur, en utilisant une boucle while (les côtés diminuent tant qu’ils restent plus grands que cote_min).

from gturtle import *

def spirale(angle, cote_initial, decr, cote_min):
    ...

speed(10)
spirale(360 / 8, 150, 5, 10)

Exercice 2 — compte à rebours

Écrivez un programme qui affiche un compte à rebours de 10 à 1 (un nombre par ligne), puis affiche "BOOM!". Utilisez une boucle while, pas for.

! Sortie attendue

10
9
8
7
6
5
4
3
2
1
BOOM!

Exercice 3 — multiples de 9

Écrivez un programme qui affiche tous les multiples de 9 jusqu’à 200 (un multiple par ligne), à l’aide d’une boucle while.

Devoir donné par Cédric

Terminer les exercices sur la boucle while (transformation for → while, spirale, compte à rebours).