đ Boucles
- while
- Affectation
- range / for
- Structures combinées
- break / continue / pass
- DRY
- Boucles imbriquées
- input()
- Trace
- Activités
La boucle apporte à la programmation une puissance considérable.
Elle permet de répéter des actions, de parcourir des listes, de traiter des données
de maniĂšre efficace.
Elle est un des piliers de la programmation avec les conditions et les fonctions.
En gros, sa structure est la suivante :
Tant que (une certaine condition est vraie) :
# instructions à répéter
# instructions à répéter
# instructions à répéter
Si on exécutait ce pseudo-code, on répéterait l'exécution des lignes 2 à 4 tant que la condition de la ligne 1 est vraie.
DÚs que la condition devient fausse, on sort de la boucle et on continue l'exécution du programme à la ligne 5.
En Python, on utilise le mot-clé while pour créer une boucle de ce type.
Voici un exemple simple :
compteur = 0
while compteur < 5:
print("Compteur =", compteur)
compteur = compteur + 1 # Incrémente le compteur de 1
print("Fin de la boucle")
Dans cet exemple, la boucle while continue tant que la variable compteur est inférieure à 5, c'est-à -dire tant que l'expression compteur < 5 est évaluée à True.
à chaque itération (tour de la boucle), elle affiche la valeur du compteur (ligne 3) et l'incrémente de 1 (ligne 4).
Quand compteur atteint 5, la condition (compteur < 5) devient fausse (False) et la boucle se termine.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrĂȘt sur la ligne 1 et avancez une ligne Ă la fois pour suivre l'Ă©volution de la variable compteur.
Il est crucial de s'assurer que la condition de la boucle deviendra fausse à un moment donné.
Sinon, la boucle continuera indéfiniment, ce qui peut faire planter votre programme.
Dans l'exemple ci-dessus, si on oublie d'incrĂ©menter compteur, la condition compteur < 5 restera toujours vraie et la boucle ne s'arrĂȘtera jamais.
Pour incrémenter une variable, on peut utiliser l'opérateur d'affectation raccourcie +=.
Par exemple, au lieu d'écrire compteur = compteur + 1, on peut écrire compteur += 1.
Cela fonctionne de la mĂȘme maniĂšre pour les autres opĂ©rations mathĂ©matiques avec les opĂ©rateurs -=, *=, /=, etc.
Voici le mĂȘme exemple avec l'opĂ©rateur += :
compteur = 0
while compteur < 5:
print("Compteur =", compteur)
compteur += 1 # Incrémente le compteur de 1
print("Fin de la boucle")
Voici un autre exemple qui utilise une boucle while pour calculer la somme des nombres de 1 Ă 10 :
somme = 0
nombre = 1
while nombre <= 10:
somme += nombre # Ajoute le nombre courant Ă la somme
nombre += 1 # Passe au nombre suivant
print("La somme des nombres de 1 Ă 10 est :", somme)
Dans cet exemple, la boucle continue tant que nombre est inférieur ou égal à 10 (nombre <= 10).
à chaque itération, elle ajoute la valeur de nombre à somme et incrémente nombre de 1.
Quand nombre devient 11, la condition nombre <= 10 devient fausse et la boucle se termine.
Le programme affiche alors la somme totale des nombres de 1 Ă 10.
Exécutez-le en mode débogage pour suivre l'évolution des variables somme et nombre à chaque itération!
Les explications de cette section étaient-elles claires ?
Nous avons déjà vu l'opérateur d'affectation = qui permet d'affecter une valeur à une variable.
Par exemple :
x = 5
y = 10
Python propose Ă©galement des opĂ©rateurs d'affectation composĂ©s qui permettent de faire des opĂ©rations mathĂ©matiques et de rĂ©affecter le rĂ©sultat Ă la mĂȘme variable en une seule instruction.
Voici les opérateurs d'affectation composés les plus courants :
| OpĂ©rateur | Description | Exemple | Ăquivalent Ă |
|---|---|---|---|
| += | Addition et affectation | a += b | a = a + b |
| -= | Soustraction et affectation | a -= b | a = a - b |
| *= | Multiplication et affectation | a *= b | a = a * b |
| /= | Division et affectation | a /= b | a = a / b |
| %= | Modulo et affectation | a %= b | a = a % b |
| //= | Division entiĂšre et affectation | a //= b | a = a // b |
| **= | Exponentiation et affectation | a **= b | a = a ** b |
Ces opérateurs sont trÚs utiles pour simplifier le code et rendre les opérations plus concises.
compteur = 0
compteur += 1 # équivalent à compteur = compteur + 1
compteur *= 2 # équivalent à compteur = compteur * 2
print(compteur) # Affiche 2
Les explications de cette section étaient-elles claires ?
range()range() génÚre une séquence de nombres. Il existe 3 façons de l'appeler selon le nombre de paramÚtres :
range(stop): part de0, avance de1en1, s'arrĂȘte avantstoprange(start, stop): part destart, avance de1en1, s'arrĂȘte avantstoprange(start, stop, step): part destart, avance destepenstep, s'arrĂȘte avantstop
| Appel | Produit les nombres |
|---|---|
| range(5) | 0, 1, 2, 3, 4 |
| range(1, 5) | 1, 2, 3, 4 |
| range(0, 11, 2) | 0, 2, 4, 6, 8, 10 |
| range(5, 0, -1) | 5, 4, 3, 2, 1 |
â ïž range() n'est pas exactement une liste en Python, mais elle se comporte de la mĂȘme façon lorsqu'on la parcourt.
for avec range()La boucle for parcourt une séquence de valeurs une par une, et exécute les instructions du bloc à chaque itération (à chaque tour de boucle).
Sa structure est la suivante :
for i in range(start, stop, step):
# instructions répétées à chaque itération
à chaque itération de boucle, i prend automatiquement la valeur suivante dans la séquence produite par range().
La boucle for est un cas particulier de while. Elle est simplement plus pratique quand on sait d'avance combien de tours on veut faire.
Voici quatre exemples, lisez d'abord le commentaire, puis le code :
# Exemple 1 : i vaut 0, puis 1, puis 2, puis 3, puis 4 â 5 tours
for i in range(5):
print(i)
# Exemple 2 : i commence Ă 1 et s'arrĂȘte avant 6 â affiche 1 Ă 5
for i in range(1, 6):
print(i)
# Exemple 3 : i avance de 2 en 2 â affiche seulement les pairs
for i in range(0, 11, 2):
print(i)
# Exemple 4 : step nĂ©gatif â i descend de 5 jusqu'Ă 1
for i in range(5, 0, -1):
print(i)
đ ExĂ©cutez ces exemples en mode dĂ©bogage, un Ă la fois.
Mettez un point d'arrĂȘt sur le for et avancez ligne par ligne pour voir i changer de valeur Ă chaque itĂ©ration.
for, range() et len()Puisque range() produit une sĂ©quence d'index (0, 1, 2âŠ), on peut l'utiliser pour accĂ©der Ă chaque Ă©lĂ©ment d'une liste tour par itĂ©ration.
len(liste) retourne le nombre d'éléments d'une liste. Donc range(len(liste)) génÚre exactement les bons index pour parcourir toute la liste :
consoles = ["PS5", "Xbox Series X", "Nintendo Switch 2"]
nb_elements = len(consoles) # nb_elements vaut 3
for i in range(nb_elements): # i prendra les valeurs 0, 1, 2
print(consoles[i]) # accÚde à l'élément à la position i
# On aurait pu écrire directement :
# for i in range(len(consoles)):
Au 1er tour : i vaut 0 â consoles[0] â "PS5"
Au 2e tour  : i vaut 1 â consoles[1] â "Xbox Series X"
Au 3e tour  : i vaut 2 â consoles[2] â "Nintendo Switch 2"
đ ExĂ©cutez ce code en mode dĂ©bogage et observez i et consoles[i] Ă©voluer ensemble Ă chaque itĂ©ration.
i : utiliser _Parfois, on veut simplement répéter une action un certain nombre de fois, sans jamais utiliser la valeur de i à l'intérieur de la boucle.
Par exemple, afficher 5 fois le mĂȘme message :
for i in range(5):
print("Bienvenue!") # i n'est pas utilisé
Dans ce cas, nommer la variable i est trompeur : ça laisse croire qu'on va s'en servir, alors qu'on ne l'utilise pas.
La convention en Python est d'utiliser _ (un tiret bas) pour signaler explicitement que la variable est intentionnellement ignorée :
for _ in range(5):
print("Bienvenue!") # on répÚte 5 fois, la valeur du tour ne nous intéresse pas
Le résultat est identique, mais _ communique clairement l'intention : "je n'ai pas besoin de savoir à quel tour je suis, je veux juste répéter."
đ RĂšgle simple : si on utilise la variable de boucle dans le bloc (consoles[i], i * 2, etc.), on la nomme i. Si on ne l'utilise jamais, on utilise _.
for ou while? Savoir choisirLa rĂšgle est simple : for quand on connaĂźt le nombre de tours d'avance, while quand on ne le connaĂźt pas.
On utilise un for quand le nombre d'itérations est connu ou calculable avant d'entrer dans la boucle :
- Afficher les 12 mois de l'annĂ©e â on sait qu'il y en a exactement 12.
- Parcourir une liste de 30 Ă©tudiants â
len(liste)nous donne le compte d'avance. - Calculer la table de multiplication de 7 (de 1 Ă 10) â exactement 10 tours.
- RĂ©pĂ©ter une action 5 fois â le nombre est fixĂ© d'avance.
On n'a pas le choix d'utiliser un while quand le nombre d'itérations dépend de quelque chose qui survient pendant l'exécution, donc impossible à connaßtre d'avance :
- Redemander un mot de passe tant qu'il est incorrect â l'utilisateur pourrait le rĂ©ussir au 1er essai... ou au 50e. Impossible Ă prĂ©voir.
- GĂ©nĂ©rer des nombres alĂ©atoires jusqu'Ă tomber sur un 6 â ça pourrait arriver tout de suite ou prendre des dizaines de tours.
- Continuer une partie tant que le joueur n'a pas perdu â on ne sait pas combien de tours durera la partie.
- Lire des donnĂ©es tant qu'il en reste Ă lire â le nombre dĂ©pend du contenu du fichier.
đ Le test mental : « Est-ce que je peux Ă©crire le nombre de tours sur un papier AVANT de lancer la boucle? » Si oui â for. Si non â while.
Les explications de cette section étaient-elles claires ?
Il est possible de combiner les différentes structures de contrÎle pour créer des programmes plus complexes et puissants.
Par exemple, on peut imbriquer des boucles à l'intérieur d'autres boucles, ou utiliser des conditions à l'intérieur de boucles.
Voici un exemple simple qui combine une boucle for avec une condition if pour afficher les nombres pairs de 0 Ă 10 :
for i in range(11):
if i % 2 == 0:
print(i)
Dans cet exemple, la boucle for itÚre sur les nombres de 0 à 10, et la condition if vérifie si le nombre est pair (c'est-à -dire si le reste de la division par 2 est égal à 0).
Si la condition est vraie, le nombre est affiché.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrĂȘt sur la ligne 1 et avancez une ligne Ă la fois pour suivre l'Ă©volution de la variable i et l'Ă©valuation de la condition.
On peut combiner for et if pour traiter les éléments d'une liste selon une condition.
Voici un exemple qui parcourt une liste de températures et affiche un message différent selon que la température indique une fiÚvre ou non :
temperatures = [36.5, 38.2, 37.1, 39.8, 36.9]
for i in range(len(temperatures)):
if temperatures[i] > 37.5:
print(f"{temperatures[i]}°C : fiÚvre!")
else:
print(f"{temperatures[i]}°C : normale")
à chaque itération, i prend la valeur de l'index courant et temperatures[i] accÚde à la température correspondante dans la liste.
La condition if détermine ensuite quel message afficher pour cette température.
Exécutez ce code en mode débogage pour suivre l'évolution de i et de temperatures[i] à chaque itération.
Les explications de cette section étaient-elles claires ?
break, continue et passParfois, on peut vouloir interrompre une boucle avant qu'elle ne se termine naturellement, ou sauter certaines itérations.
Python fournit trois instructions spéciales pour gérer ces situations : break, continue et pass.
breakCette instruction permet de sortir immédiatement d'une boucle, qu'elle soit for ou while.
Lorsqu'un break est rencontré, l'exécution du programme continue à la ligne suivant la boucle.
for i in range(10):
if i == 5:
break # Sort de la boucle lorsque i vaut 5
print(i)
print("Fin de la boucle")
Dans cet exemple, la boucle s'arrĂȘte dĂšs que i atteint 5.
continueCette instruction permet de sauter le reste du code dans la boucle pour l'itération en cours et de passer directement à l'itération suivante.
for i in range(10):
if i % 2 == 0:
continue # Saute les nombres pairs
print(i)
Ici, seuls les nombres impairs sont affichés, car les nombres pairs sont ignorés grùce à continue.
passCette instruction est un "no-op" (no operation), c'est-Ă -dire qu'elle ne fait rien.
Elle est souvent utilisĂ©e comme un espace rĂ©servĂ© dans des blocs de code oĂč une instruction est requise syntaxiquement mais oĂč aucune action n'est nĂ©cessaire.
for i in range(5):
if i < 3:
pass # Ne fait rien pour i < 3
else:
print(i)
Dans cet exemple, rien ne se passe pour les valeurs de i inférieures à 3, mais pour les autres valeurs, elles sont affichées.
Exécutez ces exemples en mode débogage pour bien comprendre comment chaque instruction affecte le flux d'exécution de la boucle.
Mettez des points d'arrĂȘt aux endroits stratĂ©giques et avancez ligne par ligne pour observer le comportement du programme.
Les explications de cette section étaient-elles claires ?
En programmation, on suit souvent le principe DRY (Don't Repeat Yourself).
Si vous remarquez que vous copiez-collez un bloc d'instructions en changeant seulement quelques valeurs, c'est le signe qu'il faut utiliser une boucle!
Voici un programme qui affiche les informations de trois étudiants. Le bloc d'instructions est répété trois fois, seules les valeurs changent :
print("Ătudiant #1")
print("Nom : Félix")
print("Note : 72")
print()
print("Ătudiant #2")
print("Nom : Dayron")
print("Note : 91")
print()
print("Ătudiant #3")
print("Nom : Léa")
print("Note : 58")
print()
Ce code fonctionne, mais il est difficile à maintenir : ajouter un 4e étudiant oblige à copier-coller un nouveau bloc. Et si le format d'affichage change, il faut modifier trois endroits!
En observant les trois blocs, on remarque que seules trois choses varient d'un bloc Ă l'autre :
- Le numéro de l'étudiant (
#1,#2,#3) - Le nom (
Félix,Dayron,Léa) - La note (
72,91,58)
Le numéro correspond simplement à la position dans la liste (index 0, 1, 2), donc on peut le calculer automatiquement avec i + 1.
On regroupe les noms et les notes dans des listes parallĂšles :
noms = ["Félix", "Dayron", "Léa"]
notes = [72, 91, 58]
Maintenant qu'on a les données dans des listes, une seule boucle suffit pour traiter tous les étudiants :
noms = ["Félix", "Dayron", "Léa"]
notes = [72, 91, 58]
nb_elements = len(noms)
for i in range(nb_elements):
print(f"Ătudiant #{i + 1}")
print(f"Nom : {noms[i]}")
print(f"Note : {notes[i]}")
print()
Le résultat affiché est identique à la version redondante, mais le code est bien plus court et plus facile à maintenir.
Pour ajouter un 4e étudiant, on n'ajoute qu'un élément dans chaque liste et la boucle s'adapte automatiquement grùce à len() :
noms = ["Félix", "Dayron", "Léa", "Tristan"]
notes = [72, 91, 58, 83]
nb_elements = len(noms)
for i in range(nb_elements):
print(f"Ătudiant #{i + 1}")
print(f"Nom : {noms[i]}")
print(f"Note : {notes[i]}")
print()
đ Le corps de la boucle n'a pas changĂ© d'une seule ligne. C'est la puissance de combiner les listes et les boucles!
Les explications de cette section étaient-elles claires ?
Il est possible de placer une boucle à l'intérieur d'une autre boucle.
On parle alors de boucles imbriquées.
Voici un exemple simple avec deux boucles for imbriquées pour afficher une table de multiplication :
for i in range(1, 6): # Boucle extérieure pour les lignes
for j in range(1, 6): # Boucle intérieure pour les colonnes
print(i * j, end='\t') # Affiche le produit avec une tabulation
print() # Nouvelle ligne aprĂšs chaque ligne de la table
Dans cet exemple, la boucle extérieure itÚre sur les valeurs de i de 1 à 5, et pour chaque valeur de i, la boucle intérieure itÚre sur les valeurs de j de 1 à 5.
Le produit i * j est affiché dans une grille formatée.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrĂȘt sur la ligne 1 et avancez une ligne Ă la fois pour suivre l'Ă©volution des variables i et j.
whileVoici un exemple similaire utilisant des boucles while imbriquées pour afficher un triangle d'étoiles :
lignes = 5
i = 1
while i <= lignes: # Boucle extérieure pour les lignes
j = 1
while j <= i: # Boucle intérieure pour les étoiles dans chaque ligne
print('*', end=' ') # Afficher une étoile sans générer un saut de ligne
j += 1
print() # Nouvelle ligne aprÚs chaque ligne d'étoiles
i += 1
Dans cet exemple, la boucle extérieure contrÎle le nombre de lignes, tandis que la boucle intérieure contrÎle le nombre d'étoiles affichées dans chaque ligne.
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Mettez un point d'arrĂȘt sur la ligne 2 et avancez une ligne Ă la fois pour suivre l'Ă©volution des variables i et j.
Voici une fonction qui prend comme paramĂštres une largeur et une hauteur, et qui affiche un rectangle de # de ces dimensions :
def afficher_rectangle(largeur, hauteur):
for i in range(hauteur): # Boucle pour chaque ligne
for j in range(largeur): # Boucle pour chaque colonne
print('#', end='') # Affiche un '#' sans saut de ligne
print() # Nouvelle ligne aprĂšs chaque ligne de '#'
afficher_rectangle(5, 3)
Exécutez ce code en mode débogage pour bien comprendre son fonctionnement.
Il devrait afficher :
#####
#####
#####
Voici maintenant une version qui utilise la concaténation de chaßnes de caractÚres (str) pour construire chaque ligne avant de l'afficher :
def afficher_rectangle(largeur, hauteur):
for i in range(hauteur): # Boucle pour chaque ligne
ligne = '' # Initialise une chaĂźne vide pour la ligne
for j in range(largeur): # Boucle pour chaque colonne
ligne += '#' # ConcatĂšne un '#' Ă la chaĂźne de la ligne
print(ligne) # Affiche la ligne complĂšte
afficher_rectangle(5, 3)
Vous remarquerez que le rĂ©sultat est le mĂȘme, mais la mĂ©thode est diffĂ©rente.
Entre autres, cela Ă©vite d'utiliser print() Ă chaque itĂ©ration de la boucle intĂ©rieure, ce qui peut ĂȘtre plus efficace pour de grandes dimensions.
Exécutez ce code en mode débogage pour bien voir la str ligne s'allonger à chaque itération de la boucle intérieure.
Les explications de cette section étaient-elles claires ?
La fonction input()â
La fonction input() permet de demander à l'utilisateur de saisir une entrée.
Elle peut ĂȘtre utilisĂ©e avec ou sans paramĂštre.
- Sans paramĂštre, elle attend une saisie de l'utilisateur.
- Avec un paramĂštre, elle affiche un message pour guider l'utilisateur.
Par exemple (essayez ce code dans un script Python) :
# Exemple sans paramĂštre
saisie_utilisateur = input() # attend une saisie de lâutilisateur
print(saisie_utilisateur)
# Exemple avec un paramĂštre
prenom = input("Veuillez saisir votre prénom : ")
print(prenom)
Lorsque la fonction input(...) est exécutée, le programme se met en pause.
Le programme attend que lâutilisateur.rice Ă©crive quelque chose dans la console et quâil ou elle appuie sur la touche ENTRĂE.
Câest donc normal que lâinstruction suivante ne soit pas exĂ©cutĂ©e tant que vous nâavez pas saisi quelque chose dans la console!
La fonction input(...) retourne TOUJOURS une chaĂźne de caractĂšres (str), mĂȘme si lâutilisateur saisit un nombre.
Pour utiliser la valeur dans un calcul, il faut la convertir avec int() ou float().
Voici deux exemples concrets :
# Demander un nombre entier (int)
age = int(input("Entrez votre Ăąge : "))
print(f"Dans 10 ans, vous aurez {age + 10} ans.")
# Demander un nombre décimal (float)
taille = float(input("Entrez votre taille en mĂštres : "))
print(f"Votre taille en centimĂštres est {taille * 100} cm.")
int() convertit la chaßne en nombre entier et float() en nombre décimal.
Sans cette conversion, Python traiterait la saisie comme du texte et lâaddition ou la multiplication ne fonctionnerait pas comme prĂ©vu.
Les explications de cette section étaient-elles claires ?
đ”ïžââïž Trace dâexĂ©cution avec des structures rĂ©pĂ©titivesâ
Voici un exemple de trace d'exécution contenant des structures répétitives
- Certaines lignes s'exécutent plusieurs fois, c'est le principe de la boucle!
- On indique les lignes qui testent une condition (
whileetfor).
Traceâ
On aura la trace suivante :
| portée globale | |||||
|---|---|---|---|---|---|
| #ligne | i | affichage | pile d'appels | fonction appelée | valeur retournée |
| 1 | 0 | ||||
| 2 | 0 | ||||
| 3 | 0 | i vaut 0 | |||
| 4 | 1 | ||||
| 2 | 1 | ||||
| 3 | 1 | i vaut 1 | |||
| 4 | 2 | ||||
| 2 | 2 | ||||
| 5 | 2 | ||||
Pour favoriser une progression efficace, ce cours adopte une approche de classe inversée. Ce modÚle déplace l'acquisition théorique hors de la classe pour transformer les heures de rencontre en véritables séances d'application pratique.
-
Ă la maison (Exploration et Appropriation) : Vous ĂȘtes le maĂźtre de votre rythme. Ces activitĂ©s vous permettent de dĂ©couvrir les nouveaux concepts et tester les exemples au moment oĂč vous ĂȘtes le plus concentrĂ©. Si une notion vous semble obscure, n'hĂ©sitez pas Ă poser des questions Ă votre prof au fur et Ă mesure.
-
En classe (Application et Consolidation) : Le temps en prĂ©sentiel est une ressource prĂ©cieuse. Nous l'utilisons pour nous attaquer aux dĂ©fis plus complexes et aux exercices de programmation qui demandent une mobilisation active de vos connaissances. Câest le moment idĂ©al pour obtenir une rĂ©troaction immĂ©diate, collaborer avec vos pairs et bĂ©nĂ©ficier de l'accompagnement de votre enseignant au moment oĂč vous en avez le plus besoin.
- đ ActivitĂ©s Ă faire Ă la maison
- đ« ActivitĂ©s Ă faire en classe
đ§ Auto-validation des connaissancesâ
Ce formulaire sert à vérifier votre compréhension des éléments les plus importants de la rencontre R05. Ne faites ce questionnaire que lorsque vous vous sentez en trÚs bonne maßtrise de la matiÚre. En classe, dÚs votre arrivée, vous aurez un questionnaire trÚs similaire, évalué sommativement, à compléter sans accÚs à aucune documentation.
Ne pas remplir le formulaire diminue fortement vos chances de rĂ©ussir lâĂ©valuation sommative en dĂ©but de rencontre.
Assurez-vous de bien comprendre toutes les notions derriĂšre chaque question.
âïž Exercices de comprĂ©hensionâ
đš Pour rĂ©aliser cet exercice, imprimez le tableau de trace d'exĂ©cution.
En situation d'examen, vous devrez compléter une trace d'exécution sur papier sans utiliser d'ordinateur.
Sans exécuter le code, déterminez ce que le programme ci-dessous va afficher dans la console.\
En suivant la recette de trace avec fonctions, complétez le tableau de trace d'exécution ligne par ligne.
def double(x, y, z):
b = 9
return x * y + z - x
a = 5
b = 6
z = 7
a = double(z, b, a)
Validez ensuite votre trace en exécutant le programme en mode débogage.
Avancez pas à pas et observez l'évolution de chaque variable à chaque ligne.
Appel de fonction, paramÚtres et ordre des arguments, return, portée des variables (variable locale b), trace d'exécution, débogueur
whileđš Pour rĂ©aliser cet exercice, imprimez le tableau de trace d'exĂ©cution.
Sans exécuter le code, déterminez ce que le programme ci-dessous va afficher dans la console.
En suivant la recette de trace avec boucle, complétez le tableau de trace d'exécution ligne par ligne.
mystere = 1
while mystere < 4 :
mystere += mystere
print(mystere)
print("FIN DU PROGRAMME")
Validez ensuite votre trace en exécutant le programme en mode débogage.
Avancez pas à pas et observez l'évolution de chaque variable à chaque ligne.
Boucle while, condition d'arrĂȘt, opĂ©rateur +=, trace d'exĂ©cution, dĂ©bogueur
while, if, breakđš Pour rĂ©aliser cet exercice, imprimez le tableau de trace d'exĂ©cution.
Sans exécuter le code, déterminez ce que le programme ci-dessous va afficher dans la console.
En suivant les recettes de trace avec boucle et avec condition, complétez le tableau de trace d'exécution ligne par ligne.
compteur = 1
nombre = 1
while compteur < 3:
nombre = nombre + compteur
if compteur % 2 == 0:
break
compteur += 1
print(f"compteur = {compteur} nombre = {nombre}")
Validez ensuite votre trace en exécutant le programme en mode débogage.
Avancez pas à pas et observez l'évolution de chaque variable à chaque ligne.
Boucle while, condition d'arrĂȘt, structure conditionnelle (if), break, opĂ©rateur modulo (%), opĂ©rateur +=, variables accumulatrices, f-string, trace d'exĂ©cution, dĂ©bogueur
range imbriquĂ©, if, continueđš Pour rĂ©aliser cet exercice, imprimez le tableau de trace d'exĂ©cution.
Sans exécuter le code, déterminez ce que le programme ci-dessous va afficher dans la console.
En suivant les recettes de trace avec boucle et avec condition, complétez le tableau de trace d'exécution ligne par ligne.
for i in range(1, 3):
if i == 2:
continue
for j in range(4, 6):
print(i + j)
Validez ensuite votre trace en exécutant le programme en mode débogage.
Avancez pas à pas et observez l'évolution de chaque variable à chaque ligne.
Boucles for imbriquées, range(), structure conditionnelle (if), continue, ordre d'exécution, trace d'exécution, débogueur
đŻ Solutionnaires
Consultez le solutionnaire uniquement aprĂšs avoir complĂ©tĂ© l'exercice par vous-mĂȘme.
Comparer votre réponse avec une solution vous permet de valider votre raisonnement et de corriger vos erreurs.
Consulter la solution avant d'avoir tenté l'exercice prive votre cerveau de l'occasion de construire des connexions durables.
- RĂ©vision : Trace avec fonction â solutionnaire.pdf
- Trace
whileâ solutionnaire.pdf - Trace
while,if,breakâ solutionnaire.pdf - Trace
rangeimbriquĂ©,if,continueâ solutionnaire.pdf
âïž Exercices de comprĂ©hensionâ
Pour les exercices de cette section, vous pouvez consulter librement la documentation du site web du cours.
đ CrĂ©ez un fichier r05_debogue_compte.md pour votre rĂ©ponse.
En exécutant ce code en mode débogage, déterminez :
- combien de fois la ligne 4 est exécutée,
- les valeurs successives de
resultat.
def factorielle(n):
resultat = 1
for i in range(1, n + 1):
resultat *= i
return resultat
r = factorielle(9)
print(r)
Boucle for avec range(), débogueur (compter les itérations, observer une variable), return
đ CrĂ©ez un fichier r05_evalue_expression.md pour votre rĂ©ponse.
ExĂ©cutez ce code en mode dĂ©bogage et, en suivant cette recette, utilisez la fonctionnalitĂ© "Evaluate Expression" pour calculer les expressions suivantes lorsque l'exĂ©cution est arrĂȘtĂ©e Ă la ligne 5 (mettez un point d'arrĂȘt!) :
compteur * 2compteur > 3compteur % 2 == 0compteur + 100
total = 0
compteur = 0
for i in range(1, 6): # i â va valoir 1, 2, 3, 4 puis 5
total += i
compteur += 1
print(total)
print(compteur)
- Une fois la boucle terminée, que représente concrÚtement la valeur affichée aux lignes 6 et 7?
total et compteur sont des variables accumulatrices : elles ne reçoivent pas une valeur fixe dÚs le départ, mais s'enrichissent à chaque passage dans la boucle. On les reconnaßt à leur initialisation à 0 avant la boucle et à l'opérateur += qui accumule les valeurs au fil des itérations.
DĂ©bogueur (« Evaluate Expression », point d'arrĂȘt), boucle for, opĂ©rateurs arithmĂ©tiques et logiques, modulo
đš Exercices de crĂ©ationâ
Pour chacun des exercices de cette section, vous devez créer des fichiers .py avec les noms indiqués.
Pour les exercices de cette section, vous pouvez consulter librement la documentation du site web du cours.
đ CrĂ©ez un fichier r05_aleatoire.py pour votre rĂ©ponse.
Afficher 5 chiffres aléatoires les uns en dessous des autres.
- Les chiffres doivent ĂȘtre compris dans l'ensemble 1, 2, 3, 4, 5.
- Un mĂȘme chiffre peut ĂȘtre affichĂ© plusieurs fois.
Boucle (for), module random
đ CrĂ©ez un fichier r05_cible.py pour votre rĂ©ponse.
Ăcrivez un programme qui gĂ©nĂšre des nombres entiers alĂ©atoires entre 1 et 10 Ă l'infini, et qui s'arrĂȘte dĂšs qu'il gĂ©nĂšre un multiple de 7.
à chaque tour, le programme affiche le nombre généré.
Quand la condition d'arrĂȘt est atteinte, il affiche un message de fin indiquant combien de nombres ont Ă©tĂ© gĂ©nĂ©rĂ©s au total.
â Exemple de sortie (les valeurs changent Ă chaque exĂ©cution)
3
9
2
7
ArrĂȘt aprĂšs 4 nombres gĂ©nĂ©rĂ©s.
La boucle while est idéale ici : on ne sait pas à l'avance combien de tours seront nécessaires.
Pour compter les tours, utilisez une variable accumulatrice.
đŻ Pour aller plus loinâ
Modifiez le programme pour qu'il s'arrĂȘte plutĂŽt dĂšs que le mĂȘme nombre est gĂ©nĂ©rĂ© deux fois de suite.
(Indice : il faut mémoriser le nombre du tour précédent.)
Boucle while avec condition d'arrĂȘt non triviale, module random, variable accumulatrice (compteur de tours), opĂ©rateur modulo (%)
đ CrĂ©ez un fichier r05_devine.py pour votre rĂ©ponse.
Ăcrivez un programme qui choisit un nombre entier alĂ©atoire entre 0 et 100.
L'utilisateur doit deviner ce nombre.
Tant que la réponse est incorrecte, le programme indique si le nombre à deviner est plus haut ou plus bas.
Lorsqu'il trouve le bon nombre, le programme le félicite.
Exemple de messages :
â "Plus haut!"
â "Plus bas!"
â "Bravo humain, vous avez trouvĂ© le nombre!"
Pour ce numéro, vous devez utiliser la fonction input() et int().
Il est possible d'utiliser ces fonctions à l'intérieur d'une boucle!
Lorsque la fonction input(...) est exécutée, le programme se met en pause.
Le programme attend que l'utilisateur.rice Ă©crive quelque chose dans la console et qu'il ou elle appuie sur la touche ENTRĂE.
C'est donc normal que l'instruction suivante ne soit pas exécutée tant que vous n'avez pas saisi quelque chose dans la console!
Boucle while, module random, input(), int(), structures conditionnelles, condition d'arrĂȘt
đ CrĂ©ez un fichier r05_liste_aleatoire_boucle.py pour votre rĂ©ponse.
à la Rencontre #2, vous aviez rempli une liste avec cinq .append() copiés-collés, et un petit mot disait :
« une boucle ferait ça automatiquement⊠vous verrez ça bientÎt! ».
BientĂŽt, c'est maintenant. đ
PARTIE 1 - Construire la liste avec une boucleâ
- Partez d'une liste vide.
- à l'aide d'une boucle, ajoutez 10 nombres entiers aléatoires (entre 1 et 100 inclusivement) à la liste.
- Affichez la liste obtenue.
PARTIE 2 - Parcourir la liste par indexâ
- Parcourez la liste avec une boucle pour afficher chaque nombre sur sa propre ligne, prĂ©cĂ©dĂ© de « â ».
- Dans la mĂȘme logique de parcours, comptez combien de nombres sont supĂ©rieurs Ă 50 Ă l'aide d'une variable accumulatrice
compteur.
Utilisez une variable accumulatrice initialisée à 0 avant la boucle. à l'intérieur, une structure conditionnelle (if) vous permettra de décider à quel moment l'incrémenter.
â Exemple de sortie (les valeurs changent Ă chaque exĂ©cution)
Liste générée : [42, 7, 91, 55, 23, 88, 3, 67, 50, 12]
â 42
â 7
â 91
...
â 12
Nombres supérieurs à 50 : 4
đŻ Pour aller plus loinâ
Modifiez le programme pour générer non pas 10, mais 10 000 nombres, sans rien changer d'autre que ce nombre.
Construction d'une liste avec .append() dans une boucle, parcours par index, accumulateur de comptage, for + if, module random, généralisation
đ CrĂ©ez un fichier r05_umbrella_boucle.py pour votre rĂ©ponse.
à la Rencontre #3, vous aviez amélioré le rapport de l'Umbrella Corporation en créant une fonction afficher_echantillon(...) que vous appeliez 3 fois manuellement sur des listes parallÚles.
La promesse Ă©tait : « avec une boucle, un seul appel suffirait pour traiter tous les Ă©chantillons ». Tenons-la! đ§
đ ïž INSTRUCTIONSâ
- Recopier intégralement le code fait pour l'exercice (
r03_umbrella_corporation.py) dans le nouveau scriptr05_umbrella_boucle.py. - Ne modifiez pas la fonction
afficher_echantillon(...)(vous devez l'utiliser sans la modifier). - Remplacez les 3 appels manuels à la fonction par une seule boucle appelant la fonction avec les valeurs de l'échantillon correspondant à l'index
i.
Lorsqu'on exĂ©cute votre version, on doit observer exactement le mĂȘme rĂ©sultat que la version R3, mais avec un appel de fonction au lieu de trois.
đŻ Pour aller plus loinâ
Ajoutez un 4ᔠéchantillon dans les listes. Votre boucle doit l'afficher sans aucune autre modification au code. C'est ça, la puissance de combiner listes et boucles!
Boucle for, parcours de listes parallÚles par index, réutilisation et appel d'une fonction dans une boucle, généralisation via len()
đ CrĂ©ez un fichier r05_statistiques.py pour votre rĂ©ponse.
La corporation remarque des variations de la température dans l'une des salles d'entreposage.
Différentes mesures de la température ont été prises durant la journée :
temperatures = [23.5, 25.4, 27.6, 21.9, 26.7, 24.6]
Vous n'avez pas le droit d'utiliser des fonctions prĂ©dĂ©finies comme min(), max(), sum(), len(), sort(), sorted(), ... (àČ„âŁàČ„).
Votre code doit fonctionner peu importe le nombre de mesures dans la liste.
PARTIE 1 : Compteur, somme et moyenneâ
Ă l'aide d'une boucle, calculez et affichez :
- le nombre de mesures prises
- la somme des températures
- la température moyenne
â RĂ©sultat attendu :
Températures : [23.5, 25.4, 27.6, 21.9, 26.7, 24.6]
nb. mesures : 6
somme : 149.7
moyenne : 24.95
- Compteur : utilisez une variable accumulatrice, comme vu précédemment, pour compter le nombre de températures.
- Somme : utilisez une variable accumulatrice, comme vu précédemment, pour faire la somme des températures.
- Moyenne : calculez-la aprÚs la boucle à partir des deux variables précédentes.
PARTIE 2 : Minimum et maximumâ
Ajoutez une deuxiÚme boucle pour calculer et afficher la température la plus basse et la plus élevée.
â RĂ©sultat attendu (en plus de la Partie 1) :
min : 21.9
max : 27.6
- Initialisez
min_tempetmax_tempavec le premier élément de la liste avant de démarrer la boucle. - à chaque itération, comparez la température courante avec
min_tempetmax_temp, et mettez-les à jour si nécessaire. - AprÚs la derniÚre itération,
min_tempetmax_tempcontiennent les valeurs recherchées.
đŻ Pour aller plus loinâ
Fusionnez vos deux boucles en une seule qui calcule les 5 statistiques en mĂȘme temps.
Boucle (for/while), parcours d'une liste, variables accumulatrices (compteur, somme), calcul de min/max sans fonction prédéfinie, structures conditionnelles, généralisation
đ CrĂ©ez un fichier r05_decimales.py pour votre rĂ©ponse.
à la Rencontre #2, vous avez découvert que les nombres flottants ne sont pas toujours exacts (0.1 + 0.2 donne 0.30000000000000004).
On va maintenant utiliser une boucle imbriquée pour observer ce phénomÚne à plus grande échelle.
Bob veut énumérer les décimales 0.1 à 0.9, puis 0.01 à 0.09, puis 0.001 à 0.009.
Il les calcule en multipliant un chiffre i (de 1 à 9) par une puissance de 10 négative :
for puissance in range(1, 4): # puissance vaut 1, puis 2, puis 3
for i in range(1, 10): # i vaut 1, 2, ..., 9
nombre = i * 10 ** -puissance
print(nombre, end=" ")
print() # saut de ligne aprĂšs chaque groupe
PARTIE 1 - Observerâ
Exécutez ce code et observez la sortie.
Repérez les nombres qui ne s'affichent pas exactement comme prévu (par exemple 0.30000000000000004 au lieu de 0.3).
PARTIE 2 - Comparer avec round()â
Modifiez la boucle pour afficher, à cÎté de chaque nombre, sa version arrondie avec round(nombre, puissance).
Pour chaque valeur, affichez aussi si les deux sont identiques ou non grĂące Ă une condition.
â Exemple de sortie (extrait)
0.1 â round: 0.1 â identique
0.2 â round: 0.2 â identique
0.30000000000000004 â round: 0.3 â DIFFĂRENT
0.4 â round: 0.4 â identique
đŻ Pour aller plus loinâ
- Augmentez la portĂ©e pour aller jusqu'Ă
0.000000001en changeant une seule valeur dans votre code. - Bob a essayĂ© une autre mĂ©thode pour gĂ©nĂ©rer les mĂȘmes dĂ©cimales :
au lieu de multiplier, il construit une chaĂźne de caractĂšres puis la convertit enfloat.
Remplacez la ligne 3 (nombre = i * 10 ** -puissance) par :
nombre = float("0." + "0" * (puissance - 1) + str(i))
Reprenez votre comparaison de la Partie 2 avec cette mĂ©thode. Que remarquez-vous? Y a-t-il encore des nombres marquĂ©s « DIFFĂRENT »?
đĄ Cela illustre une idĂ©e importante : la prĂ©cision dĂ©pend de la façon dont on calcule une valeur, pas seulement de la valeur elle-mĂȘme.
Boucles imbriquĂ©es (for), range(), opĂ©rateur de puissance (**), prĂ©cision des flottants, round(), structure conditionnelle, end dans print(), conversion str â float
đ CrĂ©ez un fichier r05_generer_nombre.py pour votre rĂ©ponse.
Le code de la fonction ci-dessous permet de générer un nombre de 3 chiffres (sans zéro) :
import random
def generer_nombre():
nombre = 0
position = 0
chiffre_aleatoire = random.randint(1, 9)
nombre += chiffre_aleatoire * 10 ** position # 10**0 = 1
position = 1
chiffre_aleatoire = random.randint(1, 9)
nombre += chiffre_aleatoire * 10 ** position # 10**1 = 10
position = 2
chiffre_aleatoire = random.randint(1, 9)
nombre += chiffre_aleatoire * 10 ** position # 10**2 = 100
return nombre
resultat = generer_nombre()
print(f"Nombre généré : {resultat}")
- Modifier le code afin de retirer la répétition de code (à l'aide d'une boucle).
- Ajouter un paramÚtre optionnel à la fonction pour indiquer la longueur du nombre à générer (par défaut 3).
Boucles (for/while), refactorisation (DRY), définition de fonction, paramÚtre avec valeur par défaut, module random, opérateurs arithmétiques (puissances de 10)
đ CrĂ©ez un fichier r05_etoile_1.py pour votre rĂ©ponse.
Nous allons transformer un code rĂ©pĂ©titif affichant des lignes dâĂ©toiles sur plusieurs lignes
en une version plus propre et flexible grĂące Ă lâutilisation de boucles.
#Ligne #1
print('*', end='')
print()
#Ligne #2
print('*', end='') # Affiche une étoile et évite le saut de ligne
print('*', end='')
print() # GénÚre une ligne vide
#Ligne #3
print('*', end='')
print('*', end='')
print('*', end='')
print()
#Ligne #4
print('*', end='')
print('*', end='')
print('*', end='')
print('*', end='')
print()
đȘ ĂTAPES Ă SUIVREâ
-
đ COMPRENDRE LE MOTIF
Exécutez le code dans PyCharm et observez le motif affiché.
Chaque ligne contient un nombre croissant dâĂ©toiles, allant de 1 Ă 4. -
đ IDENTIFIER LA RĂPĂTITION
Tentez d'observer la répétition et tentez de voir comment on peut généraliser le tout.
Pour chaque ligne, vous remarquez qu'on fait toujours les mĂȘmes 2 actions :- Afficher un nombre variable d'Ă©toiles selon la ligne
- Puis réaliser un saut de ligne.
-
đ PLANIFIER LA RĂSOLUTION Ă L'AIDE DE BOUCLES
Vous aurez besoin d'une boucle pour répéter ces 2 ensembles d'actions pour chacune des lignes.
Petit problÚme : le nombre d'instructions pour afficher des étoiles est variable selon la ligne... que faire?
Vous allez avoir besoin d'une boucle pour représenter la création des étoiles!
Vous aurez donc une boucle de création de lignes, et à l'intérieur une boucle de création d'étoiles. -
đšđ»âđ» CODER
Vous avez assez philosophié, maintenant codez!
Lorsque vous avez fini, votre code sera générique et flexible!
Vous seriez capable d'afficher 20 lignes au lieu de 4 avec un p'tit changement mineur!
Boucles imbriquées (for), affichage sans saut de ligne (end), identification de répétitions, généralisation d'un motif
âïž Exercices sur papierâ
Faites ces exercices d'abord sur papier (ou dans un éditeur de texte simple) et sans aucune documentation, comme à l'examen.
Vous pouvez valider votre rĂ©ponse dans PyCharm Ă la fin â un luxe que vous n'aurez pas le jour de l'examen, d'oĂč l'importance de vous entraĂźner sans lui.
đ CrĂ©ez un fichier r05_cote_passage.py pour votre rĂ©ponse.
Une liste de notes est déjà déclarée dans votre programme :
notes = [72, 45, 88, 55, 91, 60, 38]
Ăcrivez le reste du programme qui parcourt cette liste et affiche, pour chaque note, si l'Ă©tudiant a rĂ©ussi (â„ 60) ou Ă©chouĂ©. Ă la fin, affichez le nombre total de rĂ©ussites.
Exemple de sortie attendu :
72 â RĂ©ussi
45 â ĂchouĂ©
88 â RĂ©ussi
55 â ĂchouĂ©
91 â RĂ©ussi
60 â RĂ©ussi
38 â ĂchouĂ©
Nombre de réussites : 4
Boucle for sur une liste, if/else, variable accumulatrice, f-string
đŻ Solutions des exercices
Un solutionnaire possible pour chaque exercice est disponible en format vidĂ©o avec des explications. Vous pouvez vous en servir pour comparer votre solution avec une solution possible jugĂ©e optimale et vous dĂ©bloquer aprĂšs un long moment bloquĂ© sur un exercice (ex. 20 minutes) et aprĂšs avoir utilisĂ© le dĂ©bogueur pour essayer par vous-mĂȘme de trouver le problĂšme.
Il est tout Ă fait normal que certains problĂšmes demandent du temps, de la rĂ©flexion, et parfois mĂȘme un peu de frustration. Câest prĂ©cisĂ©ment dans ces moments dâeffort que lâapprentissage sâancre rĂ©ellement.
Consulter un solutionnaire avant dâavoir tentĂ© lâexercice par soi-mĂȘme, ou le parcourir trop rapidement, revient Ă court-circuiter le processus dâapprentissage. Ce nâest pas simplement contre-productif, câest pĂ©dagogiquement dĂ©sastreux.
En sautant lâĂ©tape de la rĂ©flexion personnelle, on prive son cerveau de lâoccasion de construire des connexions durables. Et Ă force de rĂ©pĂ©ter ce rĂ©flexe, on risque de passer Ă cĂŽtĂ© des compĂ©tences essentielles, ce qui peut mener Ă des Ă©checs plus tard, mĂȘme si tout semble facile sur le moment. Alors oui, prenez le temps. Lâerreur fait partie du jeu. Câest en cherchant, en tĂątonnant, en doutant, quâon devient rĂ©ellement compĂ©tent. Le solutionnaire doit ĂȘtre un outil de validation, pas un raccourci.
âïž Solution des exercices de comprĂ©hension :
- DĂ©bogue et compte â solutionnaire.pdf
- Evalue une expression â solutionnaire.pdf
đš Solution des exercices de crĂ©ation :
- Afficher 5 chiffres aléatoires
- Générateur jusqu'à la cible
- Jeu de devinette numérique
- Remplir et analyser une liste
- Umbrella Corporation, version boucle
- Calculer des statistiques
- ĂnumĂ©rer des dĂ©cimales (solutionnaire Ă venir)
- Générer un nombre - DRY : boucle simple
- Affichage d'étoiles - DRY : boucle imbriquée
âïž Solution des exercices sur papier :