Aller au contenu

Les flux avec répétition contrôlée — L'instruction for

Tu connais maintenant la boucle while : elle répète un bloc tant qu’une condition est vraie. Elle te permet d’exprimer toute forme de répétition dans ton code, mais pour certaines tâches, c’est inutilement laborieux.

Considère ces situations :

SituationSait-on combien de fois boucler ?
Redemander un mot de passe tant qu’il est mauvaisNon — dépend de l’utilisateur
Afficher les 100 premiers multiples de 5Oui — exactement 100 fois
Attendre qu’un capteur détecte un mouvementNon — dépend du capteur
Calculer la somme des 50 premiers entiersOui — exactement 50 fois
Boucle de jeu jusqu’à « quitter »Non — dépend du joueur
Effectuer une opération sur 10 itemsOui — exactement 10 fois

Quand on connaît à l’avance le nombre d’itérations ou que celui-ci est limité à une liste, la boucle for est beaucoup plus naturelle.

Afficher les nombres de 1 à 5 avec while :

i = 1 # 1. Initialisation du compteur
while i <= 5: # 2. Condition d'arrêt
print(i)
i = i + 1 # 3. Progression du compteur

Il nous faut gérer manuellement le compteur (initialisation et progression) et la condition d’arrêt.

  • Si on oublie la progression → boucle infinie.
  • Si on se trompe dans la condition → mauvais résultat.

Avec l’instruction for, le même programme s’écrit bien plus simplement :

for i in range(1, 6): # Initialisation + Progression + Condition
print(i)

for variable in range(...):
instructions

À chaque itération, la variable prend automatiquement la valeur suivante dans la séquence définie par range().

for i in range(5):
print(i)
0
1
2
3
4

range(5) produit les valeurs 0, 1, 2, 3, 45 valeurs, mais ça commence à 0 et s’arrête avant 5. C’est la forme la plus simple. On l’utilise surtout quand on veut répéter N fois.

for i in range(1, 6):
print(i)
1
2
3
4
5

On choisit le point de départ. La borne de fin reste exclue.

Le troisième argument contrôle le pas (step) — l’écart entre chaque valeur :

for i in range(0, 20, 5):
print(i)
0
5
10
15

Le pas de 5 fait avancer de 5 en 5. La borne de fin (20) est toujours exclue.

Sans le troisième argument, le pas est de 1 par défaut. Écrire range(1, 6) est donc équivalent à range(1, 6, 1).

Autre exemple — les nombres pairs de 0 à 20 :

for i in range(0, 21, 2):
print(i, end=" ")
print()
0 2 4 6 8 10 12 14 16 18 20

Le pas n’est pas limité à des petites valeurs. On peut sauter de 100 en 100, de 1000 en 1000, etc. :

for i in range(0, 1001, 250):
print(i, end=" ")
print()
0 250 500 750 1000

Le pas détermine l’écart constant entre chaque valeur de la séquence :

pas=5 pas=5 pas=5 pas=5
↓ ↓ ↓ ↓
0 ────▶ 5 ────▶ 10 ────▶ 15 ────▶ (20 exclu → arrêt)
↑ ↑
debut fin
pas=2 pas=2 pas=2 pas=2
↓ ↓ ↓ ↓
2 ──▶ 4 ──▶ 6 ──▶ ... 20 ──▶ (21 exclu → arrêt)

La valeur courante augmente du pas à chaque itération. Dès qu’elle atteint ou dépasse la borne de fin, la boucle s’arrête.

Un pas négatif permet de compter à l’envers. La valeur diminue à chaque itération et la boucle s’arrête quand elle atteint ou passe sous la borne de fin :

for i in range(5, 0, -1):
print(i)
print("Décollage !")
5
4
3
2
1
Décollage !
pas=-1 pas=-1 pas=-1 pas=-1 pas=-1
↓ ↓ ↓ ↓ ↓
5 ────▶ 4 ────▶ 3 ────▶ 2 ────▶ 1 ────▶ (0 exclu → arrêt)

Avec un pas négatif, la borne de début doit être plus grande que la borne de fin. La borne de fin reste exclue : range(5, 0, -1) ne contient pas 0.


Reprenons des exemples et comparons les deux approches côte à côte.

i = 1
while i <= 10:
print("7 x", i, "=", 7 * i)
i = i + 1
somme = 0
i = 1
while i <= 100:
somme = somme + i
i = i + 1
print("Somme :", somme)
compte = 10
while compte > 0:
print(compte)
compte = compte - 1
print("Décollage !")

Dans chaque cas, où le nombre d’itérations est connu, la version for est plus courte et élimine les risques d’erreur (oubli de progression, condition mal formulée).


La factorielle de nn est le produit n!=1×2×3××nn! = 1 \times 2 \times 3 \times \ldots \times n.

n = int(input("Calcul de n! pour n = "))
factorielle = 1
for i in range(1, n + 1):
factorielle = factorielle * i
print(n, "! =", factorielle)
6 ! = 720
hauteur = int(input("Hauteur du triangle : "))
for i in range(1, hauteur + 1):
print("*" * i)
*
**
***
****
*****
print("=== TABLE DE CONVERSION °C → °F ===")
print()
for celsius in range(0, 101, 10):
fahrenheit = celsius * 9 / 5 + 32
print(celsius, "°C =", format(fahrenheit, ".1f"), "°F")
=== TABLE DE CONVERSION °C → °F ===
0 °C = 32.0 °F
10 °C = 50.0 °F
20 °C = 68.0 °F
30 °C = 86.0 °F
40 °C = 104.0 °F
50 °C = 122.0 °F
60 °C = 140.0 °F
70 °C = 158.0 °F
80 °C = 176.0 °F
90 °C = 194.0 °F
100 °C = 212.0 °F

Le pas de 10 dans range(0, 101, 10) génère la table par tranches de 10 degrés.


On peut placer une boucle à l’intérieur d’une autre. La boucle intérieure s’exécute entièrement à chaque itération de la boucle extérieure.

for ligne in range(1, 4):
for colonne in range(1, 4):
print("(", ligne, ",", colonne, ")", end=" ")
print() # Retour à la ligne après chaque ligne
( 1 , 1 ) ( 1 , 2 ) ( 1 , 3 )
( 2 , 1 ) ( 2 , 2 ) ( 2 , 3 )
( 3 , 1 ) ( 3 , 2 ) ( 3 , 3 )
for table in range(1, 6):
print("=== Table de", table, "===")
for i in range(1, 11):
print(table, "x", i, "=", table * i)
print()

La boucle extérieure parcourt les tables (1 à 5), la boucle intérieure parcourt les multiplicateurs (1 à 10).


Les deux types de boucles se combinent naturellement. Chacun joue son rôle : while pour les répétitions indéterminées, for pour les répétitions contrôlées.

while True:
print("=== MENU ===")
print("1. Afficher une table de multiplication")
print("2. Quitter")
choix = input("Ton choix : ")
match choix:
case "1":
nombre = int(input("Quelle table ? "))
for i in range(1, 11):
print(nombre, "x", i, "=", nombre * i)
print()
case "2":
print("Au revoir !")
break
case _:
print("Choix invalide")
print()

Le while True maintient le menu actif (répétition indéterminée). Le for affiche la table (répétition contrôlée : exactement 10 lignes).

On peut utiliser while pour la validation des données saisies et for pour le traitement subséquent.

# Validation de saisie
while True:
n = int(input("Nombre d'étoiles (1 à 50) : "))
if 1 <= n <= 50:
break
print("Erreur : entre 1 et 50.")
# Traitement
for i in range(n):
print("*", end="")
print()
import random
print("=== SIMULATION DE LANCERS ===")
while True:
nb_lancers = int(input("Nombre de lancers (0 pour quitter) : "))
if nb_lancers == 0:
break
somme = 0
for i in range(nb_lancers):
de = random.randint(1, 6)
somme = somme + de
moyenne = round(somme / nb_lancers, 2)
print("Moyenne sur", nb_lancers, "lancers :", moyenne)
print()
print("Au revoir !")

Le while permet de relancer des simulations. Le for exécute le nombre exact de lancers demandé.


Les instructions break et continue fonctionnent exactement de la même façon que dans un while.

# Chercher le premier multiple de 7 supérieur à 50
for i in range(1, 100):
if i % 7 == 0 and i > 50:
print("Trouvé :", i)
break
Trouvé : 56

Dès que la condition est remplie, break interrompt la boucle. Pas besoin de parcourir les 99 valeurs.

# Afficher les nombres de 1 à 20 sauf les multiples de 3
for i in range(1, 21):
if i % 3 == 0:
continue
print(i, end=" ")
print()
1 2 4 5 7 8 10 11 13 14 16 17 19 20

Les multiples de 3 sont sautés. Le print(i) n’est jamais atteint pour ces valeurs.

Comme pour while, un for peut avoir un else. Le bloc else s’exécute seulement si la boucle se termine normalement (sans break).

# Vérifier si un nombre est premier
nombre = int(input("Nombre : "))
for i in range(2, nombre):
if nombre % i == 0:
print(nombre, "n'est pas premier (divisible par", i, ")")
break
else:
print(nombre, "est premier")

Si aucun diviseur n’est trouvé (pas de break), le else s’exécute → le nombre est premier.


SituationBoucle la plus naturelle
Répéter un nombre connu de foisfor
Parcourir une suite ou listefor
Répéter indéfinimentwhile
Répéter tant qu’une condition est vraiewhile
Attendre une saisie validewhile
Limiter un nombre d’essaissouvent for
FormeDébutFin (exclue)PasExemple
range(fin)0fin1range(5) → 0, 1, 2, 3, 4
range(debut, fin)debutfin1range(1, 6) → 1, 2, 3, 4, 5
range(debut, fin, pas)debutfinpasrange(0, 20, 5) → 0, 5, 10, 15

range() génère des séquences de nombres. Mais la boucle for est en réalité conçue pour parcourir n’importe quelle séquence.

prenoms = ["Alice", "Bob", "Charlie"]
for prenom in prenoms:
print("Bonjour", prenom, "!")
Bonjour Alice !
Bonjour Bob !
Bonjour Charlie !

Un mot peut être vu comme une séquence de caractères.

mot = "Python"
for lettre in mot:
print(lettre)
P
y
t
h
o
n

La syntaxe est toujours la même : for variable in séquence. Ce qui change, c’est la séquence parcourue.

  • Avec range(), c’est une séquence de nombres.
  • Avec une liste, c’est une séquence d’éléments.
  • Avec une chaîne, c’est une séquence de caractères.