Aller au contenu

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 :

print("Coucou")
print("Coucou")
print("Coucou")
print("Coucou")
print("Coucou")

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.

for loop in range(5):
    print("Coucou")

qui va produire cette sortie :

Coucou
Coucou
Coucou
Coucou
Coucou

Au lieu de la variable loop, on trouve souvent la variable i. Cela donne :

for i in range(5):
    print("Coucou")

Pour coder la répétition, nous avons utilisé la structure suivante :

for i in range(5):
    bloc d'instructions

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

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Tester - 2

Recopier à la main l'exemple donné ci-dessus avec la variable i

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Tester - 3

👉 Remarque : vous trouverez aussi des codes comme celui-ci

for _ in range(5):
    print("Coucou")

Recopier à la main l'exemple donné ci-dessus avec la variable _

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

À 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

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
for i in range(7):
    print("Je dois respecter le Grand Sorcier.")
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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
for i in range(10):  # (1)
    print("J'ai tout compris 😊 !")  # (2)
  1. Ne pas oublier : en fin de ligne

  2. Ne pas oublier l'indentation (grâce à une tabulation)

Cliquer sur les + pour lire les explications

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 ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

L'affichage produit n'est pas le bon.

On voudrait obtenir :

Bob mange  1 fraises
Bob mange  2 fraises
Bob mange  3 fraises
Bob mange  4 fraises
Bob mange  5 fraises
Bob mange  6 fraises
Bob mange  7 fraises
Bob mange  8 fraises
Bob mange  9 fraises
Bob mange  10 fraises

Rectifier le code

Rectifier ci-dessous pour obtenir l'affichage désiré.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution 1
nombre = 1

for i in range(10) :
    print("Bob mange ", nombre, "fraises")
    nombre = nombre + 1  # à chaque cueillette, il mange une fraise de plus
Solution 2
nombre = 0

for i in range(10) :
    nombre = nombre + 1  # à chaque cueillette, il mange une fraise de plus
    print("Bob mange ", nombre, "fraises")      
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) ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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 :

i = 0  
i = 1  
i = 2
...  
i = 49 
i = 50

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
for i in range(51):
    print("i = ", 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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Modifiez la valeur 55 dans le code ci-dessus, et comprenez ce qu'il se passe :

Essayer par exemple : 51, 52, 54, 49 ...

Exemple

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

III. La syntaxe par l'exemple⚓︎

for i in range(n)

Important

Prenez le temps de lire les commentaires !

Cliquez sur les +

for i in range(4):  # (1) (2)
   print(i)  
  1. ⚠ Le caractère : est obligatoire après if, elif, else, for et while. Il provoque l'indentation automatique du bloc d'instruction qui suit.

  2. ⚠ i prend les valeurs entières de l'intervalle [0; 4[

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Table de multiplication

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Améliorer la table de multiplications ? (Cliquer)

D'habitude, on ne commence pas à \(0 \times nombre\), mais à \(1 \times nombre\)

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

for i in range(a, b)

Important

Prenez le temps de lire les commentaires !

Cliquez sur les +

for i in range(2, 5):  # (1)
    print(i)  
  1. ⚠ i prend les valeurs entières de l'intervalle [2; 5[

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

for i in range(a, b, pas)

Important

Prenez le temps de lire les commentaires !

Cliquez sur les +

for i in range(1, 10, 2):  # (1)
print(i)  
  1. ⚠ i prend les valeurs entières de l'intervalle [1; 10[ avec un pas de 2

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Parcours par éléments

Important

Prenez le temps de lire les commentaires !

Cliquez sur les +

for lettre in "NSI":  # (1)
    print(lettre)  
  1. ⚠ lettre prend comme valeurs successivement tous les caractères de "NSI"

Tester :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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. :

3
6
9
12
15
18

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution : Question 1
for i in range(6) :
    print("numéro :", 3 * (i + 1))

Question 2

Vous devez faire une boucle qui affiche les numéros suivants, Utilise une boucle for i in range(...) avec deux arguments. :

3
6
9
12
15
18

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution : Question 2
for i in range(1, 7) :
    print("numéro :", 3 * i)

Question 3

Vous devez faire une boucle qui affiche les numéros suivants, Utilise une boucle for i in range(...) avec trois arguments. :

3
6
9
12
15
18

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution : Question 3
for i in range(3, 19, 3) :
    print("numéro :", 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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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

Solution
for i in range(12): 
    print(i)

2. Question 2.
Ecrire un code Python qui affiche les entiers de 10 à 21

Solution
for i in range(10, 22) : 
    print(i)

3. Question 3.
Ecrire un code Python qui affiche Les carrés des entiers entre 1 et 10 compris

Solution
for i in range(1, 11) :
    print(i ** 2)

Exercice 4 : QCM

  • On donne le script suivant :

    somme = 0
    for i in range(1, 6):
        somme = somme + i
    print(somme)
    
    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 valider après avoir exécuté play

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(og)wrh3a v,clS/ekm=pnib1:y-2+ut_dPf7s0050I0r0G0j0x0o0M0k0n0o0j0M0M0u010G0x0v010406050M0F0t0t0j0g0B040p0c0o0F0(0c0w050q0/0;0?0^0-0v040518111b0q180-0I0x0l0W0Y0!0$0Y0w0d0F0j0d0r0C0v0B0G0h0 0k0h0x0d0h0o1D0h0G0+050R0y0o0r1k0Z0#011C1E1G1E0G1M1O1K0G0g191y0W0{0M0v0j0w0$0D011Q1m010K0T0r0w0j0t0r1K1,1.1?1S1_1O1|1~0+0a0k0J0g0c0v0c0M0x0~0w0k0P1*0g0g0r0n2j11210w190q1y2w1$1(1%1L0I231n0x0w1{2g1K1h1j0X1R2G2I0w0c2M1K0v2p192u2w2Z0.1-2k2O1@2S0g0=0o1K0j1B2p0K0$030H0H0n2T0r1G2R0c0C0D0L0C0z0+0z110j2!2%0,2$222)1S2+2-2/2;0r2?012^2`2|2~2J31331;040D383a1.3c2u2F013h0j2.192:0h2=2@2_2{0P3r2S3t0C0i0+0i3y2t3b1c2X112M2z0I1(2E3f0$3O1 193%1a3#2#123Z3.2Y2%0k0x0I0$2_2u3S353I3}3 013N3q2H3s32341=270r403p3P4b3R4d443X3C3,3E0+0M0c0;0r3Y3A0k3d2(1l1S0c0+0u4y2v4A4q4D0$0t0x0+0N4I3c3^3A4B464i424d3v052:3~4i3.3Q304!4f1}4h484j2}4l4,3u1K0q394W4r0s0+0K0c0g4S4K3|4r0w0+0x544}4M010c0f59104U4J5c2P3E0y0+0g1.1t4S5l1@0*040b5t4L5m4O365z565d5w0m5b5A1@5C040z0N375j3{3e5G0+0e0A4S0-5R4W4(4;4Z333U455$494k2 3S3U0k4g4)4a5/4d5*3y0k5}555T5m58044u4w5J5F5m4F044H5R5 4C614t4v1~66601@690E6j6e2*595Y5t0q3`3!0r2w3;2x3)112A6C0j1N6x3$1i4T0P0R0T0M04.
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 valider après avoir exécuté play

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(og)wrh3a v,c8lS/ekm=pnib1:y-2ut_d*Pfs050I0s0G0j0y0p0M0k0n0p0j0M0M0v010G0y0w010406050M0F0u0u0j0g0C040q0c0p0F0%0c0x050r0.0:0=0@0,0w040517101a0r170,0I0y0l0V0X0Z0#0X0x0d0F0j0d0s0D0w0C0G0h0~0k0h0y0d0h0p1C0h0G0*050Q0z0p0s1j0Y0!011B1D1F1D0G1L1N1J0G0g181x0V0`0M0w0j0x0#0E011P1l010L0S0s0x0j0u0s1J1+1-1=1R1^1N1{1}0*0a0k0K0g0c0w0c0M0y0}0x0k0O1)0g0g0s0n2i10200x180r1x2v1#1%1$1K0I221m0y0x1`2f1J1g1i0W1Q2F2H0x0c2L1J0w2o182t2v2Y0-1,2j2N1?2R0g0;0p1J0j1A2o0L0#030H0H0n2S0s1F2Q0c0D0E0o0D0A0*0A100j2Z2$0+2#212(1R2*2,2.2:0s2=012@2_2{2}2I30321:040E37391-3b2t2E013g0j2-182/0h2;2?2^2`0O3q2R3s0D0i0*0i3x2s3a1b2W102L2y0I1%2D3e0#3N1~183$193!2!113Y3-2X2$0k0y0I0#2^2t3R343H3|3~013M3p2G3r31331;260s3 3o3O4a3Q4c433W3B3+3D0*2V2S0F2h3X3z0k3c2%1k1R0c0*0v4x2u4z4p4C0#0u0y354H3b3@3z4A454h414c3u052/3}4h3-3P2 4Y4e1|4g474i2|4k4*3t1J0r384U4q0t0*0L0c0g4Q4J3{4q0x0*0y524{4L010c0f570 4S4I5a2O3D0z0*0g1-1s4Q5j1?0)040b5r4K5k4N4P5h3`3d5b5u0m595y1?5A040A365C5s1R5u0e0B4Q0,5P3B4$4/4X323T445Z484j2~3R3T0k4f4%495,4c5%3x0k5`535E5k56044t0I4v0G5I545b4E044G5C5|4B5~4s2c624w6b5Q0#680J655}2)575V5r0r3_3Z0s2v3:2w3(102z6C0j1M6x3#1h4R0O0Q0S0M04.
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 valider après avoir exécuté play

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013(og)wrh36a v,clS/ekm=p9nib1:y-2+ut_d*Pfs0050K0s0I0k0z0p0O0l0o0p0k0O0O0v010I0z0w010406050O0H0u0u0k0g0D040q0c0p0H0*0c0y050r0;0?0^0`0/0w04051a131d0r1a0/0K0z0m0Y0!0$0(0!0y0d0H0k0d0s0E0w0D0I0h110l0h0z0d0h0p1F0h0I0-050T0A0p0s1m0#0%011E1G1I1G0I1O1Q1M0I0g1b1A0Y0}0O0w0k0y0(0F011S1o010N0V0s0y0k0u0s1M1.1:1^1U1{1Q1~200-0a0l0M0g0c0w0c0O0z100y0l0R1,0g0g0s0o2l13230y1b0r1A2y1(1*1)1N0K251p0z0y1}2i1M1j1l0Z1T2I2K0y0c2O1M0w2r1b2w2y2#0:1/2m2Q1_2U0g0@0p1M0k1D2r0N0(030J0J0o2V0s1I2T0c0E0F0x0E0B0-0B130k2$2)0.2(242+1U2-2/2;2?0s2^012`2|2~302L33351?040F3a3c1:3e2w2H013j0k2:1b2=0h2@2_2{2}0R3t2U3v0E0i0-0i3A2v3d1e2Z132O2B0K1*2G3h0(3Q211b3)1c3%2%143#3:2!2)0l0z0K0(2{2w3U373K3 41013P3s2J3u34361@290s423r3R4d3T4f463Z3E3.3G0-0O0c0?0s3!3C0l3f2*1n1U0c0-0v4A2x4C4s4F0(0u0z0-0P4K3e3`3C4D484k444f3x052=404k3:3S324$4h1 4j4a4l2 4n4.3w1M0r3b4Y4t0t0-0N0c0g4U4M3~4t0y0-0z564 4O010c0f5b124W4L5e2R3G0A0-0g1:1v4U5n1_0,040b5v4N5o4Q385B585f5y0n5d5C1_5E040j5G3g5I0-0e0C4U0/5l3}244*4?4#353W475$4b4m313U3W0l4i4+4c5/4f5*3A0l5}575S5o5a044w4y5L5H5o4H044J5Z5 4E614v4x2066601_690G6j6e2,5b5R6p4G0-0L0L6s3F5O3z5Z5Y3_3|3$0s2y3?2z3+132C6M0k1P6H3(1k4V0R0T0V0O04.
Exercice 8

Ecrire un programme qui provoque l’affichage ci-dessous :

triangle dièses

Il y a 20 lignes, et la vingtième contient 20 symboles #

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Astuce

Recopier pour tester :

>>> "#" + "#"
>>> 3 * "#"
>>> 1 * "#"

⚠️ Attention : 0 * "#" n'a pas de sens !

Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
for i in range(1, 21):
    print(i*"#")
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 :

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
capital_initial = int(input("Capital initial : "))
t = int(input("taux en %. Par exemple saisir 2 pour un taux de 2% : "))
capital = capital_initial
for i in range(5):
    capital = capital*(1 + t/100)
print(capital)

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.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Astuce

Indication : il faut une variable supplémentaire n

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)

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 :"

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

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 :

Python
1
2
3
4
for a in range(1,5):
    for b in range(1,4):
        p = a * b
        print(a, '*', b, '=', p)
va donner ceci :
Python
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
4 * 1 = 4
4 * 2 = 8
4 * 3 = 12

Analyse grâce à PythonTutor

Un deuxième exemple

Tester le programme suivant :

Python
1
2
3
4
for i in range(3):
    print("Début du bloc d'instructions de la première boucle")
    for j in range(5):
        print(f'i = {i} et j = {j}')
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
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 :

Python
--- Table du  1 ---
1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
1 * 4 = 4
1 * 5 = 5
1 * 6 = 6
1 * 7 = 7
1 * 8 = 8
1 * 9 = 9
1 * 10 = 10
--------------------
--- Table du  2 ---
2 * 1 = 2
2 * 2 = 4
etc...
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Solution
Python
1
2
3
4
5
6
for a in range(1,11):
    print("-"*3,"Table du ",a,"-"*3)
    for b in range(1,11):
        p = a * b
        print(a, '*', b, '=', p)
    print("-"*20)
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 :

Python
1
2
3
adultes = ['Papa', 'Maman', 'Mamie']
for parent in adultes:
    print(parent) 
Que fait ce script ?

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution : Analyse grâce à PythonTutor

2. A l'aide des listes ci-dessous :

Python
adultes = ['Papa', 'Maman', 'Mamie']
enfants = ['Riri', 'Fifi', 'Loulou']
Écrire un programme qui affiche :
Python
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 ! »

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Correction
Python
1
2
3
4
5
6
adultes = ['Papa', 'Maman', 'Mamie']
enfants = ['Riri', 'Fifi', 'Loulou']

for parent in adultes:
    for enfant in enfants:
        print(parent, 'dit : « et une cuillère pour', enfant, '! »')   

3. Rajouter à la phrase précédente le contenu de la cuillère

Python
adultes = ['Papa', 'Maman', 'Mamie']
enfants = ['Riri', 'Fifi', 'Loulou']
nourriture  = ['purée', 'compote']
Écrire un programme qui affiche :
Python
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 ! »

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Correction
Python
1
2
3
4
for parent in ['Papa', 'Maman', 'Mamie']:
    for enfant in ['Riri', 'Fifi', 'Loulou']:
        for nourriture in ['purée', 'compote']:
            print(parent, 'dit : « et une cuillère de', nourriture, 'pour', enfant, '! »')

VI Un peu de graphisme...⚓︎

Exercice 12

Travail sur ipythonblocks :

image

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 de n nombres entiers : on s'en servira dès qu'on aura besoin de répéter n fois des instructions.