Lenaick Sorimoutou

Retour

10. Les boucles avancées en Python

Approfondissez les boucles Python : boucles imbriquées, contrôle de flux avec break/continue, et techniques d'optimisation.

PYTHON pour les DÉBUTANTS #10#

Les boucles avancées en Python#

Maintenant que vous maîtrisez les bases des boucles, découvrons les techniques avancées qui vous permettront d’écrire du code plus efficace et élégant.

Boucles imbriquées#

Explication

Les boucles imbriquées permettent de traiter des structures de données complexes comme des matrices, des tableaux à deux dimensions, ou des listes de listes.

Exemple de base#

Table de multiplication simple
# Table de multiplication
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} x {j} = {i * j}")
print() # Ligne vide entre les tables

Traitement de matrices#

Parcours d'une matrice 3x3
# Matrice 3x3
matrice = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Parcourir la matrice
for ligne in range(len(matrice)):
for colonne in range(len(matrice[ligne])):
print(f"Position [{ligne}][{colonne}] = {matrice[ligne][colonne]}")

Recherche dans une liste de listes#

Calcul de moyennes d'étudiants
# Liste d'étudiants avec leurs notes
etudiants = [
["Alice", [15, 18, 12]],
["Bob", [14, 16, 19]],
["Charlie", [17, 13, 16]]
]
# Calculer la moyenne de chaque étudiant
for nom, notes in etudiants:
moyenne = sum(notes) / len(notes)
print(f"{nom}: {moyenne:.2f}")

Contrôle de flux avec break et continue#

L’instruction break#

Définition

break permet de sortir complètement d’une boucle, interrompant toutes les itérations restantes.

Recherche avec break
# Recherche d'un élément dans une liste
nombres = [1, 3, 5, 7, 9, 11, 13, 15]
recherche = 7
trouve = False
for nombre in nombres:
if nombre == recherche:
trouve = True
print(f"Trouvé ! {recherche} est dans la liste")
break
print(f"Vérification de {nombre}...")
if not trouve:
print(f"{recherche} n'est pas dans la liste")

L’instruction continue#

Définition

continue permet de passer à l’itération suivante sans exécuter le reste du code dans la boucle actuelle.

Filtrage avec continue
# Afficher seulement les nombres pairs
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
for nombre in nombres:
if nombre % 2 != 0: # Si impair
continue # Passer au suivant
print(f"{nombre} est pair")

Exemple combiné#

Utilisation combinée de break et continue
# Traitement de données avec conditions
donnees = [10, -5, 0, 15, -3, 20, 0, -8]
for valeur in donnees:
if valeur == 0:
print("Valeur nulle ignorée")
continue
if valeur < 0:
print(f"Valeur négative trouvée: {valeur}")
break
print(f"Traitement de: {valeur}")

Boucles avec else#

Conseil

En Python, les boucles peuvent avoir une clause else qui s’exécute si la boucle se termine normalement (sans break). C’est une fonctionnalité unique à Python !

Exemple avec recherche#

Boucle avec clause else
# Recherche avec `python:else`
nombres = [1, 3, 5, 7, 9]
recherche = 4
for nombre in nombres:
if nombre == recherche:
print(f"Trouvé ! {recherche}")
break
else:
print(f"{recherche} n'a pas été trouvé dans la liste")

Vérification de primalité#

Test de nombre premier
# Vérifier si un nombre est premier
def est_premier(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
# Test de primalité
nombre = 17
if est_premier(nombre):
print(f"{nombre} est premier")
else:
print(f"{nombre} n'est pas premier")

Compréhensions de listes avancées#

Explication

Les compréhensions de listes sont une syntaxe concise et élégante pour créer des listes en Python. Elles remplacent souvent les boucles for traditionnelles pour créer des listes.

Compréhensions imbriquées#

Compréhensions de listes imbriquées
# Matrice de multiplication
table = [[i * j for j in range(1, 4)] for i in range(1, 4)]
print(table)
# [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
# Aplatir une liste de listes
matrice = [[1, 2], [3, 4], [5, 6]]
aplatie = [element for ligne in matrice for element in ligne]
print(aplatie) # [1, 2, 3, 4, 5, 6]

Compréhensions avec conditions#

Compréhensions avec filtrage
# Nombres pairs au carré
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
carres_pairs = [x**2 for x in nombres if x % 2 == 0]
print(carres_pairs) # [4, 16, 36, 64, 100]
# Mots de plus de 3 caractères en majuscules
mots = ["chat", "chien", "poisson", "oiseau", "lapin"]
mots_longs = [mot.upper() for mot in mots if len(mot) > 3]
print(mots_longs) # ['CHIEN', 'POISSON', 'OISEAU', 'LAPIN']

Fonctions avec enumerate() et zip()#

enumerate() - Parcourir avec index#

Conseil

enumerate() est parfaite quand vous avez besoin à la fois de l’élément et de son index lors du parcours d’une séquence.

Utilisation de enumerate()
# Parcourir une liste avec l'index
fruits = ["pomme", "banane", "orange"]
for index, fruit in enumerate(fruits):
print(f"{index + 1}. {fruit}")
# enumerate avec start
for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")

zip() - Parcourir plusieurs listes#

Utilisation de zip()
# Parcourir plusieurs listes simultanément
noms = ["Alice", "Bob", "Charlie"]
ages = [25, 30, 35]
villes = ["Paris", "Lyon", "Marseille"]
for nom, age, ville in zip(noms, ages, villes):
print(f"{nom}, {age} ans, habite à {ville}")
# Créer un dictionnaire avec zip
personnes = dict(zip(noms, zip(ages, villes)))
print(personnes)

Optimisation des boucles#

Important

L’optimisation des boucles peut grandement améliorer les performances de votre code, surtout quand vous traitez de grandes quantités de données.

Éviter les recalculs#

Optimisation - Éviter les recalculs
# ❌ Inefficace - recalcul à chaque itération
nombres = [1, 2, 3, 4, 5]
for i in range(len(nombres)):
if len(nombres) > 3: # Recalculé à chaque fois
print(nombres[i])
# ✅ Efficace - calcul une seule fois
nombres = [1, 2, 3, 4, 5]
longueur = len(nombres)
if longueur > 3:
for i in range(longueur):
print(nombres[i])

Utiliser les méthodes intégrées#

Optimisation - Méthodes intégrées
# ❌ Boucle manuelle
nombres = [1, 2, 3, 4, 5]
total = 0
for nombre in nombres:
total += nombre
# ✅ Méthode intégrée
nombres = [1, 2, 3, 4, 5]
total = sum(nombres)

Boucles avec générateurs#

Explication

Les générateurs permettent de créer des itérateurs de manière efficace en termes de mémoire. Ils génèrent les valeurs à la demande avec yield au lieu de les stocker toutes en mémoire.

Générateurs simples#

Générateur de nombres pairs
# Générateur de nombres pairs
def nombres_pairs(maximum):
for i in range(0, maximum, 2):
yield i
# Utilisation
for nombre in nombres_pairs(10):
print(nombre) # 0, 2, 4, 6, 8

Générateurs avec conditions#

Générateur de nombres premiers
# Générateur de nombres premiers
def nombres_premiers(maximum):
for nombre in range(2, maximum):
if est_premier(nombre):
yield nombre
# Utilisation
for premier in nombres_premiers(20):
print(premier) # 2, 3, 5, 7, 11, 13, 17, 19

Cas d’usage pratiques#

Traitement de fichiers#

Lecture de fichier ligne par ligne
# Lire un fichier ligne par ligne
def lire_fichier(nom_fichier):
try:
with open(nom_fichier, 'r', encoding='utf-8') as fichier:
for numero_ligne, ligne in enumerate(fichier, start=1):
ligne = ligne.strip()
if ligne: # Ignorer les lignes vides
print(f"Ligne {numero_ligne}: {ligne}")
except FileNotFoundError:
print(f"Le fichier {nom_fichier} n'existe pas")

Simulation de jeu#

Simulation de lancers de dés
# Simulation de lancers de dés
import random
def simuler_des(nb_lancers):
resultats = []
for _ in range(nb_lancers):
de1 = random.randint(1, 6)
de2 = random.randint(1, 6)
resultats.append((de1, de2, de1 + de2))
return resultats
# Simulation
lancers = simuler_des(10)
for i, (de1, de2, total) in enumerate(lancers, start=1):
print(f"Lancer {i}: {de1} + {de2} = {total}")

Exercices pratiques#

Conseil
  1. Table de multiplication : Créez une table de multiplication complète avec des boucles imbriquées.

  2. Recherche dans une matrice : Trouvez un élément dans une matrice et affichez sa position.

  3. Analyse de données : Traitez une liste de notes et calculez les statistiques.

  4. Générateur de mots de passe : Créez un générateur de mots de passe aléatoires.

Conclusion#

Les boucles avancées en Python offrent une grande flexibilité :

  • Boucles imbriquées : Pour traiter des structures complexes
  • Contrôle de flux : break et continue pour une logique fine
  • Clause else : Pour des cas de sortie normale
  • Compréhensions : Pour un code plus concis et lisible
  • Fonctions intégrées : enumerate() et zip() pour plus d’efficacité
  • Générateurs : Pour une utilisation mémoire optimisée avec yield

Maîtrisez ces techniques et vous écrirez des boucles Python plus efficaces et élégantes !