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 multiplicationfor i in range(1, 4): for j in range(1, 4): print(f"{i} x {j} = {i * j}") print() # Ligne vide entre les tablesTraitement de matrices#
# Matrice 3x3matrice = [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Parcourir la matricefor 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#
# Liste d'étudiants avec leurs notesetudiants = [ ["Alice", [15, 18, 12]], ["Bob", [14, 16, 19]], ["Charlie", [17, 13, 16]]]
# Calculer la moyenne de chaque étudiantfor 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 d'un élément dans une listenombres = [1, 3, 5, 7, 9, 11, 13, 15]recherche = 7trouve = 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.
# Afficher seulement les nombres pairsnombres = [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é#
# Traitement de données avec conditionsdonnees = [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#
# Recherche avec `python:else`nombres = [1, 3, 5, 7, 9]recherche = 4
for nombre in nombres: if nombre == recherche: print(f"Trouvé ! {recherche}") breakelse: print(f"{recherche} n'a pas été trouvé dans la liste")Vérification de primalité#
# Vérifier si un nombre est premierdef 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 = 17if 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#
# Matrice de multiplicationtable = [[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 listesmatrice = [[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#
# 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 majusculesmots = ["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.
# Parcourir une liste avec l'indexfruits = ["pomme", "banane", "orange"]
for index, fruit in enumerate(fruits): print(f"{index + 1}. {fruit}")
# enumerate avec startfor index, fruit in enumerate(fruits, start=1): print(f"{index}. {fruit}")zip() - Parcourir plusieurs listes#
# Parcourir plusieurs listes simultanémentnoms = ["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 zippersonnes = 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#
# ❌ Inefficace - recalcul à chaque itérationnombres = [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 foisnombres = [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#
# ❌ Boucle manuellenombres = [1, 2, 3, 4, 5]total = 0for nombre in nombres: total += nombre
# ✅ Méthode intégréenombres = [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 pairsdef nombres_pairs(maximum): for i in range(0, maximum, 2): yield i
# Utilisationfor nombre in nombres_pairs(10): print(nombre) # 0, 2, 4, 6, 8Générateurs avec conditions#
# Générateur de nombres premiersdef nombres_premiers(maximum): for nombre in range(2, maximum): if est_premier(nombre): yield nombre
# Utilisationfor premier in nombres_premiers(20): print(premier) # 2, 3, 5, 7, 11, 13, 17, 19Cas d’usage pratiques#
Traitement de fichiers#
# Lire un fichier ligne par lignedef 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ésimport 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
# Simulationlancers = simuler_des(10)for i, (de1, de2, total) in enumerate(lancers, start=1): print(f"Lancer {i}: {de1} + {de2} = {total}")Exercices pratiques#
Conseil
-
Table de multiplication : Créez une table de multiplication complète avec des boucles imbriquées.
-
Recherche dans une matrice : Trouvez un élément dans une matrice et affichez sa position.
-
Analyse de données : Traitez une liste de notes et calculez les statistiques.
-
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 :
breaketcontinuepour 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()etzip()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 !