Chapitre 1.3 - Boucle For (pour)
I. de simples répétitions⚓︎
Exemple : la situation
Les enfants du village vous ont posé beaucoup de questions sur ce que font les enfants sur Terre. Ils ont été supris d'apprendre que, comme eux, les enfants terriens doivent aller à l'école. Et ils ont trouvé très étonnant que ceux-ci doivent lever le doigt pour demander la permission de parler en classe, car eux doivent pencher la tête pour cela.
Ce que vous n'aviez pas prévu, c'est qu'une petite fille trouverait amusant de lever le doigt comme une terrienne. Sa maîtresse n'a pas du tout apprécié car, pour cette tribu, lever le doigt de cette manière est une grave insulte au grand sorcier ! La petite fille a été sévèrement punie et vous la retrouvez en pleurs. Vous vous sentez un peu responsable et décidez de l'aider à faire sa punition.
Mon info
Ainsi, imaginons que l'on souhaite écrire 5 fois « Coucou ». On pourrait le faire avec le programme suivant :
C'est plutôt convenable ici… Mais si on veut effectuer par exemple 1 000 affichages, cela va devenir bien plus fastidieux !
Pour plus d'efficacité, on aimerait indiquer directement que l'on souhaite répéter l'affichage en boucle, de la même manière qu'on pourrait écrire en français :
Répéter 5 fois :
\(\hspace{2em}\) Afficher "Coucou"
Comme pour les instructions conditionnelles, on utilise l'indentation pour définir le bloc d'instructions qui doit être répété.
En Python, pour répéter 5 fois l'instruction qui affiche « Coucou », on va écrire le programme ci-dessous.
En effet, en anglais "loop" signifie "boucle". On peut considérer que la variable loop
contient le numéro de la boucle que l'on est en train de réaliser.
qui va produire cette sortie :
Au lieu de la variable loop
, on trouve souvent la variable i
. Cela donne :
Pour coder la répétition, nous avons utilisé la structure suivante :
Vous pouvez donc écrire une boucle de cette façon, en indiquant le nombre de répétitions à la place du chiffre 5.
Nous éluciderons par la suite les mystères de cette écriture. Prenez garde à ne pas oublier le deux-points :
à la fin de la ligne.
Tester - 1
Recopier à la main l'exemple donné ci-dessus avec la variable loop
Tester - 2
Recopier à la main l'exemple donné ci-dessus avec la variable i
# Tests
(insensible à la casse)(Ctrl+I)
Tester - 3
👉 Remarque : vous trouverez aussi des codes comme celui-ci
Recopier à la main l'exemple donné ci-dessus avec la variable _
# Tests
(insensible à la casse)(Ctrl+I)
À vous de jouer - 1
Votre programme doit écrire 7 fois la phrase : "Je dois respecter le Grand Sorcier.", en plaçant cette phrase exactement une fois sur chaque ligne. Attention, si votre programme n'affiche pas exactement cette phrase avec les points et la majuscule là où il faut, il faudra tout recommencer.
Important : votre programme ne doit pas faire plus de 2 lignes
# Tests
(insensible à la casse)(Ctrl+I)
Erreurs fréquentes
Il est facile de se tromper dans les boucles lorsqu'on n'a pas l'habitude.
- Si on oublie le
:
à la fin de la ligne :
SyntaxError: invalid syntax
- Si l'on oublie d'indenter :
SyntaxError: expected an indented block
😊 Face à ce type d'erreur, on pensera donc à vérifier que le deux-points est bien présent et que l'indentation a été faite.
Corrigez l'erreur
Testez puis corrigez la ou les erreurs dans le script suivant :
# Tests
(insensible à la casse)(Ctrl+I)
II. for i in range(...)
⚓︎
Le gourmand insatiable
Bob découvre un beau fraisier....
- Il cueille une fraise et la mange.
- Y prenant goût, il y retourne et cette fois prend 2 fraises.
- N'y tenant plus, il y retourne et prend cette fois 3 fraises.
Et ainsi de suite, à chaque fois, il ne peut pas s'en empêcher, il y retourne. Et à chaque fois il prend une fraise de plus que la fois précédente !
👉 Testez ci-dessous. Quel est le problème ?
# Tests
(insensible à la casse)(Ctrl+I)
Rectifier le code
Rectifier ci-dessous pour obtenir l'affichage désiré.
# Tests
(insensible à la casse)(Ctrl+I)
Solution 1
Tester for i in range
Tester puis répondre à la questions suivante : Quelles sont les valeurs prises par la variables i
lorsqu'on exécute l'instruction
for i in range(10)
?
# Tests
(insensible à la casse)(Ctrl+I)
Solution
i
prend successivement les valeurs 0, 1, 2, 3, 4, 5, 6, 7, 8 et 9.
Cela correspond à 10 valeurs différentes.
Mon info
🖐️ Dans les activités précédentes, vous avez écrit des codes contenant des boucles, servant à répéter des instructions.
Mais la variable, nommée loop ou plus simplement i, n'était pas utilisée dans la boucle.
💡 Quand on veut simplement répéter plusieurs fois un bloc d'instruction, on n'a en effet pas besoin d'utiliser cette variable. Mais dans de très nombreux cas, cette valeur nous est très utile.
À vous de jouer 2
Ecrire un code qui affiche :
# Tests
(insensible à la casse)(Ctrl+I)
Les fraises de Bob
Pour résoudre le problèmes des cueillettes de Bob, nous n'avions en réalité pas besoin de la variable nombre
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
Doit-on toujours démarrer à 0 ?
😊 Non !
Il est possible de modifier cela. Dans l'exemple qui précède, à la première cueillette, il mange 1 fraise. Ce serait donc plus pratique si le compteur i
démarrait à 1, non ?
On peut le faire, mais attention à bien conserver 10 itérations....
Tester ci-dessous :
# Tests
(insensible à la casse)(Ctrl+I)
Ce code doit afficher, à chaque cueillette, combien Bob mange de fraises. Mais le code n'est pas correct :
Remarque
Nous avons modifié l'appel de range()
.
Au lieu de range(10)
nous avons écrit range(1, 10)
.
- au début
i
prend la valeur 1 - A la fin
i
prend la valeur 9 (comme avant, ça n'a pas changé), et pas à 10, il nous manque donc une cueillette...
Solution : le code correct pour 10 cueillettes
Tester ci-dessous :
# Tests
(insensible à la casse)(Ctrl+I)
Doit-on toujours incrémenter de 1 ?
😊 Non !
Bob est encore plus gourmand
😂 On va changer un peu les données du problème. A la première cueillette, Bob mange 5 fraises.
A la seconde, 10 fraises.
A la suivante, 15 fraises.
Et à chaque cueillette, il augmente de 5....
Le nombre de fraises est donc 5, puis 10, puis 15 etc...
On pourrait facilement s'en sortir si on avait une variable i
qui commence à 5, augmente de 5 en 5, et s'arrête à .... ???
Là encore, attention à bien conserver 10 itérations....
👉 Le plus simple es de se poser les 3 questions qui importent :
- quelle est la valeur de départ ?
- quelle est l'incrément ?
- quelle est la valeur finale ?
😀 Les 2 premières sont déjà résolues : on commence à 5 et on incrémente de 5.
🌵 La troisième question est plus délicate. Combien de fraises mange-t-il à la 10ème cueillette ?
La réponse est \(50\) :
- à la 1ere cueillette : \(1*5\) fraises
- à la 2ème cueillette : \(2*5\) fraises
- à la 3ème cueillette : \(3*5\) fraises
etc...
💡 Nous allons donc faire une boucle pour laquelle :
- au début
i = 5
- incrémente de \(5\)
- la dernière est
i = 50
Tester ci-dessous :
# Tests
(insensible à la casse)(Ctrl+I)
Modifiez la valeur 55 dans le code ci-dessus, et comprenez ce qu'il se passe :
Essayer par exemple : 51, 52, 54, 49 ...
Exemple
# Tests
(insensible à la casse)(Ctrl+I)
III. La syntaxe par l'exemple⚓︎
for i in range(n)
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
-
Le caractère
:
est obligatoire aprèsif
,elif
,else
,for
etwhile
. Il provoque l'indentation automatique du bloc d'instruction qui suit. -
i prend les valeurs entières de l'intervalle [0; 4[
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
Table de multiplication
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
Améliorer la table de multiplications ? (Cliquer)
D'habitude, on ne commence pas à \(0 \times nombre\), mais à \(1 \times nombre\)
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
for i in range(a, b)
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
- i prend les valeurs entières de l'intervalle [2; 5[
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
for i in range(a, b, pas)
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
- i prend les valeurs entières de l'intervalle [1; 10[ avec un pas de 2
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
Parcours par éléments
Important
Prenez le temps de lire les commentaires !
Cliquez sur les +
- lettre prend comme valeurs successivement tous les caractères de "NSI"
Tester :
# Tests
(insensible à la casse)(Ctrl+I)
IV. Exercices⚓︎
Exercice 1
Question 1
Vous devez faire une boucle qui affiche les numéros suivants, Utilise une boucle for i in range(...)
avec un seul argument. :
# Tests
(insensible à la casse)(Ctrl+I)
Question 2
Vous devez faire une boucle qui affiche les numéros suivants, Utilise une boucle for i in range(...)
avec deux arguments. :
# Tests
(insensible à la casse)(Ctrl+I)
Question 3
Vous devez faire une boucle qui affiche les numéros suivants, Utilise une boucle for i in range(...)
avec trois arguments. :
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 2
Question 1 : initialisation : Choix de a
et n
Exécuter le script ci-dessous pour observer les variables a
et n
qui ont automatiquement été choisies.
# Tests
(insensible à la casse)(Ctrl+I)
Question 2
Vous devrez déterminer la valeur de a
à la fin de la boucle for
, juste en réfléchissant. Il est recommandé de réaliser un tableau de déroulé.
Les variables a
et n
ont été choisies automatiquement (et affichées) lorsque vous avez exécuté le code du cadre précédant.
Pour savoir si vous avez trouvé la bonne réponse, exécuter le script suivant, et saisir la réponse que vous avez trouvée.
# Tests
(insensible à la casse)(Ctrl+I)
Solution
i prend toutes les valeurs entières de 0 à n - 1, soit n valeurs.
A chaque itération a augmente de 2, donc en tout a augmente de 2 \(\times\)n.
En sortie de boucle a vaut donc a + 2 \(\times\)n.
Exercices 3 à faire sur papier
1. Question 1.
Ecrire un code Python qui affiche les entiers de 0 à 11
2. Question 2.
Ecrire un code Python qui affiche les entiers de 10 à 21
3. Question 3.
Ecrire un code Python qui affiche Les carrés des entiers entre 1 et 10 compris
Exercice 4 : QCM
-
On donne le script suivant :
Que s'affiche-t-il ?
- 15
- 21
- 10
- 0
- Autre
Solution
Ce code fait la somme 0+1+2+3+4+5
Exercice 5
Compléter le code suivant. A la fin la variable somme
vaut la somme des entiers de 1 à 100 (compris).
Aucun affichage n'est demandé.
⚠️ N'oubliez surtout pas de valider après avoir exécuté
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 6
Compléter le code suivant. A la fin la variable produit
vaut le produit des entiers de 1 à 10 (compris).
Aucun affichage n'est demandé.
⚠️ N'oubliez surtout pas de valider après avoir exécuté
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 7
Compléter le code suivant. A la fin la variable somme
vaut la somme des carrés des entiers de 1 à 5 (compris).
Aucun affichage n'est demandé.
⚠️ N'oubliez surtout pas de valider après avoir exécuté
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 8
Ecrire un programme qui provoque l’affichage ci-dessous :
Il y a 20 lignes, et la vingtième contient 20 symboles #
# Tests
(insensible à la casse)(Ctrl+I)
Astuce
Recopier pour tester :
⚠️ Attention : 0 * "#"
n'a pas de sens !
Exercice 9
Alice a déposé ses économies à sa banque sur un compte rémunéré.
Le but de cet exercice est d'écrire un programme qui demande de saisir le capital initial déposé, le taux \(t\) en %, puis calcule le capital final, au bout de 5 ans, sachant qu’il a été placé au taux d’intérêts composé \(t\)%.
1. Le programme doit afficher le capital final au bout de 5 ans.
Astuce
Indication : chaque année le capital est multiplié par \((1+\dfrac{t}{100})\)
Compléter le code ci-dessous :
# Tests
(insensible à la casse)(Ctrl+I)
Solution
2. Recopier, puis adapter ci-dessous le programme pour qu’il affiche le résultat au bout de n
années, et non au bout de 5 ans.
# Tests
(insensible à la casse)(Ctrl+I)
Astuce
Indication : il faut une variable supplémentaire n
Solution
3. Recopier, puis adapter votre programme pour qu'il affiche aussi les intérêts acquis au bout de n années.
Astuce
Indication : les intérêts acquis sont la différence entre le capital final au bout de n années et le capital initial.
Vos affichages devront comporter des messages comme par exemple : "Capital au bout de 5 années :"
# Tests
(insensible à la casse)(Ctrl+I)
Solution
capital_initial = int(input("Capital initial : "))
t = int(input("taux en %. Par exemple saisir 2 pour un taux de 2% : "))
n = int(input("nombre d'années"))
capital = capital_initial
for i in range(n):
capital = capital*(1 + t / 100)
print("Capital au bout de ", n, " années : ", capital)
interets = capital - capital_initial
print("Interets acquis : ", interets)
V. Une situation classique : la double boucle⚓︎
Il est très souvent utile d'imbriquer une boucle dans une autre, notamment lors du parcours de tous les pixels d'une image. Prenons pour l'instant un exemple numérique.
Exemple fondateur
Le programme suivant :
va donner ceci :Analyse grâce à PythonTutor
Un deuxième exemple
Tester le programme suivant :
# Tests
(insensible à la casse)(Ctrl+I)
Exercice 10
Ecrire un programme qui affichera la table de multiplication des nombres de 1 à 10. Un simple affichage, ligne à ligne, suffira. Le programme doit donner ceci :
# Tests
(insensible à la casse)(Ctrl+I)
Solution
Exercice 11
Le but de cet exercice est de parcourir des listes et d'utiliser des boucles imbriquées.
1. Comprendre le script ci-dessous.
Recopier dans le terminal :
Que fait ce script ?# Tests
(insensible à la casse)(Ctrl+I)
Solution : Analyse grâce à PythonTutor
2. A l'aide des listes ci-dessous :
Écrire un programme qui affiche :Papa dit : « et une cuillère pour Riri ! »
Papa dit : « et une cuillère pour Fifi ! »
Papa dit : « et une cuillère pour Loulou ! »
Maman dit : « et une cuillère pour Riri ! »
Maman dit : « et une cuillère pour Fifi ! »
Maman dit : « et une cuillère pour Loulou ! »
Mamie dit : « et une cuillère pour Riri ! »
Mamie dit : « et une cuillère pour Fifi ! »
Mamie dit : « et une cuillère pour Loulou ! »
# Tests
(insensible à la casse)(Ctrl+I)
Correction
3. Rajouter à la phrase précédente le contenu de la cuillère
adultes = ['Papa', 'Maman', 'Mamie']
enfants = ['Riri', 'Fifi', 'Loulou']
nourriture = ['purée', 'compote']
Papa dit : « et une cuillère de purée pour Riri ! »
Papa dit : « et une cuillère de compote pour Riri ! »
Papa dit : « et une cuillère de purée pour Fifi ! »
Papa dit : « et une cuillère de compote pour Fifi ! »
Papa dit : « et une cuillère de purée pour Loulou ! »
Papa dit : « et une cuillère de compote pour Loulou ! »
Maman dit : « et une cuillère de purée pour Riri ! »
Maman dit : « et une cuillère de compote pour Riri ! »
# Tests
(insensible à la casse)(Ctrl+I)
VI Un peu de graphisme...⚓︎
Exercice 12
Travail sur ipythonblocks
:
Exercice à faire sur Capytale : https://capytale2.ac-paris.fr/p/basthon/n/?kernel=python3&mode=create&id=3980184
Correction
Coorection sur Capytale : https://capytale2.ac-paris.fr/p/basthon/n/?kernel=python3&mode=create&id=3980225
VII. Bilan⚓︎
À retenir ❤
-
La boucle
for ... in ...
s'utilise lorsque :- on veut parcourir un à un les éléments d'un objet itérable (une chaîne de caractère, une liste, un tuple, un dictionnaire...)
- on veut répéter une action un nombre de fois connu à l'avance. On parle de boucle bornée.
-
Les instructions répétées peuvent mais ce n'est pas obligatoire faire appel à la variable de boucle, mais il ne faut pas que ces instructions la modifient.
-
Ne pas oublier les
:
et l'indentation ! -
range(n)
génère une séquence den
nombres entiers : on s'en servira dès qu'on aura besoin de répétern
fois des instructions.
# Tests
(insensible à la casse)(Ctrl+I)