Imaginez que vous êtes un élève qui à une punition. Vous devez écrire un programme qui affiche 100 fois “Je n’utiliserai plus ChatGPT pour faire mes exercices”.
Si vous n’utilisez pas de boucles, vous devriez faire quelque chose comme ça :
print("Je n'utiliserai plus ChatGPT pour faire mes exercices")print("Je n'utiliserai plus ChatGPT pour faire mes exercices")print("Je n'utiliserai plus ChatGPT pour faire mes exercices")... # répété pleins de foisprint("Je n'utiliserai plus ChatGPT pour faire mes exercices")
En pratique, vous avez une tâche qui se répète de nombreuses fois et vous voulez l’automatiser. Cela vous permettra de vous concentrer sur le contenu de la tâche.
Cas d’usage
Voici quelques autres cas où nous pouvons rencontrer des boucles. Il s’agit d’un concept fondamental donc, ce n’est qu’une liste non exhaustive, en pratique vous en manipulerai quasiment en permanence.
traitement de conteneurs (listes) :
disons que vous gérez une liste de noms et que vous voulez imprimer chacun d’entre eux sur l’écran.
avec une boucle, vous pouvez parcourir la liste et imprimer chaque nom sans avoir à écrire une ligne de code pour chaque nom.
jeux vidéo :
dans les jeux vidéo, les boucles sont utilisées pour continuellement vérifier les entrées des joueurs, mettre à jour les graphiques à l’écran, et contrôler les interactions dans le jeu.
sans boucles, vos personnages pourraient ne pas répondre lorsque vous appuyez sur un bouton !
sites Web :
quand vous faites défiler votre fil d’actualité sur les réseaux sociaux, une boucle est utilisée pour charger et afficher de nouveaux contenus automatiquement à mesure que vous atteignez le bas de la page.
traitement de données :
pour les scientifiques de données, les boucles permettent de traiter de grands ensembles de données, en exécutant des analyses ou des transformations sur chaque élément de l’ensemble, comme calculer la moyenne des températures sur une année.
automatisation de tâches répétitives :
supposons que vous avez un ensemble de fichiers et que vous voulez renommer chacun d’eux ou en extraire certaines informations.
les boucles peuvent exécuter ces opérations sur chaque fichier en succession sans intervention manuelle.
Dans tous ces cas, nous remarquons que nous voulons exécuter une tâche plusieurs fois en parcourant des données ou en attendant un critère d’arrêt. C’est aussi exactement ce que l’on veut faire pour optimiser l’écriture de notre punition.
Mais avant cela, nous devons regarder un peu plus de théorie.
Types de boucles
Les langages de programmation (pas que Python) proposent souvent des boucles. Et nous en avons plusieurs types. Les plus connues, et que nous avons en python, sont les boucles for et les while.
Leurs points commun principal est que les deux vont définir un bloc représentant la partie de logique à répéter. Nous allons donc avoir :
un mot clé (for ou while)
des paramètres
le caractères :
l’intérieur du bloc qui est indenté
une désindantation qui marque la fin du bloc
Nous allons voir leurs spécificités dans les parties suivantes.
Boucles for
La boucle for (pour en anglais) permet de répéter une action un certain nombre de fois. On l’utilise quand on connaît à l’avance le nombre d’itérations à effectuer. C’est celle que vous allez utiliser le plus souvent, par exemple elle permet d’exprimer les concepts suivants :
avancer de 10 pas dans la rue
pelez 10 carottes…
Imaginons que nous voulions répéter 5 fois la phrase de punition en affichant le numéro d’itération, nous ferions :
for index inrange(5):print("iteration :", index, "--", "Je n'utiliserai plus ChatGPT pour faire mes exercices")
iteration : 0 -- Je n'utiliserai plus ChatGPT pour faire mes exercices
iteration : 1 -- Je n'utiliserai plus ChatGPT pour faire mes exercices
iteration : 2 -- Je n'utiliserai plus ChatGPT pour faire mes exercices
iteration : 3 -- Je n'utiliserai plus ChatGPT pour faire mes exercices
iteration : 4 -- Je n'utiliserai plus ChatGPT pour faire mes exercices
On est passé de 100 lignes à réécrire à 2. Plutôt pratique.
Pour comprendre ce bout de code, nous devons le décomposer :
for index in range(5) :
le for ... in est le mot clé permettant de déclarer la boucle, elle va parcourir ce qui est à droite du in
range(5) est une fonction permettant de générer les nombres de 0 à 4
index défini le nom de la variable qui va contenir les variables récupérées lors du parcours du range
le corps de la boucle
index permet d’accéder au contenu de la variable index. Dans notre cas elle va contenir les nombre de 0 à 4 successivement
le reste permet d’afficher la chaîne de caractère
On peut imaginer la boucle for comme un mécanisme permettant de tourner les pages d’un livre et d’effectuer une action sur chaque page. Dans notre cas, le livre représente le range, les pages sont contenues dans index et l’intérieur du bloc représente l’opération à effectuer sur la page en cours (la valeur de index).
Boucles while
La boucle while (tant que en anglais) permet de répéter une action jusqu’à une arriver à une certaine condition. On l’utilise quand on ne connaît pas à l’avance le nombre d’itérations à effectuer. Elle est plus rare à utiliser (en tout cas je l’utilise bien moins souvent). Elle permet d’exprimer les concepts suivants dans la vie de tous les jours :
attendre que l’eau bouille
marcher jusqu’à atteindre le bout de la rue…
Imaginons que nous voulions demander un mot de passe à l’utilisateur et vérifier s’il est correct dans une application (ne faites pas comme cela, c’est pour illustrer, ce n’est pas sécuritaire) :
# Le mot de passe attenducorrect_password ="python123"# Demande à l'utilisateur de saisir le mot de passeentered_password =input("Veuillez entrer le mot de passe: ")# Continue à demander tant que le mot de passe saisi n'est pas correct (note si le mot de passe est le bon dès le début, on ne rentre pas dans la boucle)while entered_password != correct_password:# Ce code sera exécuté dans que le mot de passe n'est pas le bon. Cela permet de bloquer la suite du programme tant que la condition n'est pas remplie. entered_password =input("Mot de passe incorrect. Réessayez: ")# L'utilisateur a saisi le bon mot de passeprint("Mot de passe accepté, accès autorisé.")
Pour comprendre ce bout de code, nous devons le décomposer :
while entered_password != correct_password :
while défini l’entrée dans la boucle
entered_password != correct_password représente la condition d’arrêt, tant qu’elle est fausse, la boucle continue. La valeur de entered_password est mise à jour dans le corps de la boucle.
index défini le nom de la variable qui va contenir les variables récupérées lors du parcours du range
entered_password = input("Mot de passe incorrect. Réessayez: ") : met à jour la valeur de entered_password en la demandant à l’utilisateur
Différences entre les deux
En python, les boucles while sont plus faciles à comprendre. En effet les boucles for utilisent des concepts plus avancés (dans d’autres langages on les appellerai foreach car elles manipulent des itérateurs). De plus, une boucle while peut toujours remplacer une boucle for (essayez de remplacer la boucle for de l’exemple précédent).
Cependant, habituez vous à manipuler les boucles for, elles permettent d’exprimer plus facilement les concepts et surtout elles permettent d’éviter un problème gênant : les boucles infinies.
Regardez le code suivant (si vous le lancez, il faudra faire ctrl-c pour arrêter le programme) :
La condition d’arrêt n’est jamais atteinte donc on ne sort jamais de la boucle et la boucle est infinie.
Note : on obtient la même chose avec l’exemple sur le mot de passe, si on ne trouve pas le mot de passe, on ne sort pas de la boucle (dans ce cas là c’est le comportement attendu).
Note : on peut aussi avoir des boucles infinies avec des for, c’est plus compliqué, il faut modifier l’élément que l’on parcours dans la boucle.
Boucles imbriquées
Il est tout à fait possible d’imbriquer des boucles entre elles.
Un exemple typique est l’affichage de tables de multiplications :
# Parcours des chiffres de 1 à 10 pour la table de multiplicationfor i inrange(1, 11):# Parcours des chiffres de 1 à 10 pour multiplier avec ifor j inrange(1, 11):# Calcul du produit et affichage avec un formatage pour l'alignementprint(f"{i*j:4}", end=' ')# Retour à la ligne après chaque ligne de la tableprint()
On remarque que l’intérieur de la boucle sur les j à accès aux valeurs de i.
Les boucles imbriquées peuvent rapidement devenir complexes, et il est important de veiller à ce qu’elles restent lisibles et maintenables. Il est également essentiel de comprendre leur impact sur les performances, car chaque niveau d’imbrication ajoute un niveau de complexité à l’ensemble de la boucle.
Note : En python, il est possible d’imbriquer tous les blocs (boucles, conditions, fonctions, …) entre eux.
Conclusion
Vous venez de découvrir le concept des boucles en Python. Ces structures de contrôle fondamentales vous ouvrent les portes de l’écriture de programmes plus complexes.
Pour rappel :
les boucles for :
permettent d’exécuter un nombre connu à l’avance d’itérations
sont un peu complexes mais les plus utilisées en pratique
les boucles while :
quand on ne connaît pas le nombre d’itération à l’avance mais un critère d’arrêt
peuvent exprimer tout ce que les boucles for expriment
peuvent plus facilement causer des boucles infinies
on peut imbriquer les boucles les unes dans les autres
N’hésitez pas à prendre les exemples proposés et à les modifier pour bien comprendre le concept. C’est nouveau pour vous.