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#

Les boucles imbriquées permettent de traiter des structures de données complexes.

Exemple de base#

# 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
python

Traitement de matrices#

# 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]}")
python

Recherche dans une liste de listes#

# 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}")
python

Contrôle de flux avec break et continue#

L’instruction break#

break permet de sortir complètement d’une boucle.

# 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")
python

L’instruction continue#

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

# 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")
python

Exemple combiné#

# 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}")
python

Boucles avec else#

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

Exemple avec recherche#

# Recherche avec 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")
python

Vérification de primalité#

# 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")
python

Compréhensions de listes avancées#

Compréhensions 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]
python

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 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']
python

Fonctions avec enumerate et zip#

enumerate() - Parcourir avec index#

# 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}")
python

zip() - Parcourir plusieurs listes#

# 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)
python

Optimisation des boucles#

É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])
python

Utiliser les 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)
python

Boucles avec générateurs#

Générateurs simples#

# 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
python

Générateurs avec conditions#

# 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
python

Cas d’usage pratiques#

Traitement de fichiers#

# 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")
python

Simulation de jeu#

# 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}")
python

Exercices pratiques#

  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

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