Aller au contenu principal

Les boucles en Python

Repeter des actions avec les boucles while et for

La boucle while

La boucle while repete un bloc de code tant qu'une condition est vraie. La condition est evaluee avant chaque iteration.

Syntaxe :

while condition:
# bloc repete tant que condition est vraie
compteur = 0

while compteur < 5:
print(f"Compteur : {compteur}")
compteur += 1

print("Boucle terminee !")

Sortie :

Compteur : 0
Compteur : 1
Compteur : 2
Compteur : 3
Compteur : 4
Boucle terminee !
Boucle infinie

Si la condition ne devient jamais fausse, la boucle tourne indefiniment. Assurez-vous toujours qu'une variable dans la condition est modifiee a chaque iteration. Utilisez Ctrl+C pour interrompre une boucle infinie.

# DANGER : boucle infinie !
x = 0
while x < 10:
print(x)
# Oubli : x n'est jamais incremente !
Bonne pratique - while vs for

Utilisez while quand vous ne savez pas a l'avance combien d'iterations seront necessaires (ex. : attendre une saisie valide de l'utilisateur). Utilisez for quand vous parcourez une sequence ou un nombre d'iterations connu.

La boucle for

La boucle for permet d'iterer sur n'importe quel iterable : liste, chaine, range, dictionnaire, etc.

Syntaxe :

for variable in iterable:
# bloc execute pour chaque element
fruits = ["pomme", "banane", "cerise"]

for fruit in fruits:
print(f"J'aime les {fruit}s")

Sortie :

J'aime les pommes
J'aime les bananes
J'aime les cerises

La fonction range()

range() genere une sequence d'entiers, tres utile avec les boucles for.

AppelSequence generee
range(5)0, 1, 2, 3, 4
range(1, 6)1, 2, 3, 4, 5
range(0, 10, 2)0, 2, 4, 6, 8
range(10, 0, -1)10, 9, 8, 7, 6, 5, 4, 3, 2, 1
# Compter de 0 a 4
for i in range(5):
print(i)

# Compter de 1 a 10
for i in range(1, 11):
print(i)

# Nombres pairs de 0 a 8
for i in range(0, 10, 2):
print(i)
Bonne pratique - range et listes

N'utilisez pas for i in range(len(ma_liste)): pour parcourir une liste. Preferez directement for element in ma_liste:. Si vous avez besoin de l'index ET de la valeur, utilisez enumerate() (voir plus bas).

Iterer sur des sequences

La boucle for fonctionne avec tous les types iterables.

Chaines de caracteres

mot = "Python"

for lettre in mot:
print(lettre)
# P, y, t, h, o, n (une lettre par ligne)

Listes avec condition

nombres = [3, -1, 7, -4, 9, -2, 5]

for n in nombres:
if n > 0:
print(f"{n} est positif")

Dictionnaires

personne = {"nom": "Alice", "age": 30, "ville": "Paris"}

# Parcourir les cles
for cle in personne:
print(cle)

# Parcourir les valeurs
for valeur in personne.values():
print(valeur)

# Parcourir les paires cle/valeur
for cle, valeur in personne.items():
print(f"{cle} : {valeur}")
Bonne pratique - Nommage des variables de boucle

Choisissez des noms de variables explicites : for fruit in fruits: est bien plus lisible que for x in fruits:. La variable de boucle doit decrire un element de la collection.

break et continue

break : sortir de la boucle

break interrompt immediatement la boucle et passe a la suite du programme.

nombres = [4, 7, 2, 9, 1, 6]

for n in nombres:
if n == 9:
print(f"Trouve : {n}")
break
print(f"Pas encore... ({n})")

continue : passer a l'iteration suivante

continue saute le reste du bloc courant et passe a l'iteration suivante.

for i in range(10):
if i % 2 == 0:
continue # saute les nombres pairs
print(i) # affiche uniquement 1, 3, 5, 7, 9
Bonne pratique - break avec drapeau

Plutot que d'utiliser une variable "drapeau" (flag) pour signaler une sortie anticipee, preferez break : c'est plus explicite et plus Pythonique. Vous pouvez aussi utiliser le bloc else sur la boucle (voir ci-dessous) pour savoir si la boucle s'est terminee normalement.

Le else sur les boucles

Python offre une fonctionnalite rare : le bloc else sur une boucle. Il s'execute uniquement si la boucle s'est terminee normalement (sans break).

nombres = [2, 4, 6, 8]

for n in nombres:
if n % 2 != 0:
print(f"Nombre impair trouve : {n}")
break
else:
print("Tous les nombres sont pairs !") # Affiche car pas de break
# Cas ou le else ne s'execute pas
nombres = [2, 5, 6, 8]

for n in nombres:
if n % 2 != 0:
print(f"Nombre impair trouve : {n}")
break
else:
print("Tous pairs") # N'est PAS affiche car break a ete execute

Ce comportement est utile pour les recherches : si vous parcourez une liste sans trouver ce que vous cherchez, le else vous le confirme.

enumerate() : index et valeur simultanement

enumerate() retourne des paires (index, valeur) lors de l'iteration.

fruits = ["pomme", "banane", "cerise"]

for index, fruit in enumerate(fruits):
print(f"{index}. {fruit}")

Sortie :

0. pomme
1. banane
2. cerise

On peut specifier l'index de depart :

for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")
# 1. pomme, 2. banane, 3. cerise
Bonne pratique - enumerate plutot que range(len())

Utilisez toujours enumerate() quand vous avez besoin de l'index ET de la valeur. for i, val in enumerate(liste): est bien plus lisible et Pythonique que for i in range(len(liste)): val = liste[i].

zip() : iterer sur deux listes en parallele

zip() combine plusieurs iterables en paires (ou tuples).

noms = ["Alice", "Bob", "Charlie"]
notes = [18, 14, 16]

for nom, note in zip(noms, notes):
print(f"{nom} : {note}/20")

Sortie :

Alice : 18/20
Bob : 14/20
Charlie : 16/20
# zip avec trois listes
villes = ["Paris", "Lyon", "Marseille"]
populations = [2_161_000, 516_000, 861_000]
regions = ["Ile-de-France", "Auvergne-Rhone-Alpes", "Provence-Alpes-Cote d'Azur"]

for ville, pop, region in zip(villes, populations, regions):
print(f"{ville} ({region}) : {pop:,} habitants")

Les boucles imbriquees

On peut imbriquer des boucles pour traiter des structures a plusieurs dimensions.

# Table de multiplication
for i in range(1, 6):
for j in range(1, 6):
print(f"{i*j:4}", end="")
print() # Retour a la ligne apres chaque ligne

Sortie :

1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Bonne pratique - Limiter les imbrications

Evitez d'imbriquer plus de 2 niveaux de boucles. Une boucle triply imbriquee est souvent le signe qu'il faut refactoriser en fonctions. La complexite augmente exponentiellement avec les niveaux d'imbrication.

Les comprehensions de liste

Les comprehensions de liste sont une syntaxe concise et Pythonique pour creer des listes a partir d'une boucle.

Syntaxe : [expression for variable in iterable]

Avec filtre : [expression for variable in iterable if condition]

# Sans comprehension
carres = []
for x in range(1, 6):
carres.append(x**2)
print(carres) # [1, 4, 9, 16, 25]

# Avec comprehension (equivalent)
carres = [x**2 for x in range(1, 6)]
print(carres) # [1, 4, 9, 16, 25]
# Avec condition : garder seulement les positifs
nombres = [-3, 1, -5, 7, -2, 4]
positifs = [n for n in nombres if n > 0]
print(positifs) # [1, 7, 4]
# Transformer des chaines
mots = ["bonjour", "monde", "python"]
majuscules = [mot.upper() for mot in mots]
print(majuscules) # ['BONJOUR', 'MONDE', 'PYTHON']

# Filtrer et transformer
longues_majuscules = [mot.upper() for mot in mots if len(mot) > 5]
print(longues_majuscules) # ['BONJOUR', 'PYTHON']
Bonne pratique - Comprehensions lisibles

Les comprehensions sont elegantes mais ne les surchargez pas. Si votre comprehension depasse une ligne ou contient plusieurs conditions, utilisez une boucle for classique. La lisibilite prime toujours sur la concision.

Patrons pratiques courants

Accumulateur (somme)

notes = [14, 17, 12, 18, 15]
total = 0

for note in notes:
total += note

moyenne = total / len(notes)
print(f"Moyenne : {moyenne:.1f}") # Moyenne : 15.2

Compteur

texte = "Python est un langage de programmation"
compteur_voyelles = 0

for lettre in texte.lower():
if lettre in "aeiouy":
compteur_voyelles += 1

print(f"Nombre de voyelles : {compteur_voyelles}")

Recherche avec drapeau

# Verifier si une liste contient un nombre premier (approche naive)
nombres = [4, 6, 9, 7, 10]
premier_trouve = False

for n in nombres:
if n > 1:
est_premier = True
for i in range(2, n):
if n % i == 0:
est_premier = False
break
if est_premier:
print(f"Premier nombre premier : {n}")
premier_trouve = True
break

if not premier_trouve:
print("Aucun nombre premier dans la liste")

Test de memorisation/comprehension


Que genere range(3, 8) ?


Que fait l'instruction break dans une boucle ?


Quand le bloc else d'une boucle for s'execute-t-il ?


Quelle fonction retourne des paires (index, valeur) lors de l'iteration ?


Quelle est la comprehension de liste equivalente a : for x in range(5): if x > 2: lst.append(x) ?


Une solution