Aller au contenu

Les boucles Pour (avec for)⚓

Attention

Cette partie sur les boucles for est fondamentale. N'hésitez pas à la refaire plus tard jusqu'à ce que vous ayiez bien compris.

Les boucles permettent une répétition d'instructions.

Le nombre de rĂ©pĂ©titions peut ĂȘtre connu au dĂ©part (boucle Pour) ou pas (boucle Tant que).

Dans le cas d'une boucle Pour, nous demandons Ă  une variable de prendre toutes les valeurs successives d'une collection de valeurs.

Exemple 1

###

for fruit in ["pomme", "poire", "cerise"]:bksl-nl print("Je mange une", fruit)bksl-nlprint("J'ai plus faim maintenant !")bksl-nl

A

Z

Cet exemple se lit ainsi : la variable fruit doit prendre chacune des valeurs de la liste ["pomme", "poire", "cerise"] (dans l'ordre), afficher le texte "Je mange une" suivi de la valeur de fruit.

L'instruction print("Je mange une", fruit) est ici exécutée trois fois, nous dirons qu'il y a eu trois itérations.

Bien sĂ»r, comme d'habitude, le nom de la variable fruit peut ĂȘtre changĂ© (nous pouvons mĂȘme mettre _ Ă  la place !) mais autant choisir un nom facile Ă  comprendre.

Ouvrez Python Tutor (avec Ctrl + clic gauche). Copiez-collez le code de l'exemple 1 puis cliquez sur "Visualize Execution" pour observer l'exécution de votre code pas à pas (regardez en particulier le mouvement de la flÚche verte et les valeurs de la variable fruit).

Exemple 2

###

for lettre in "Je manque d'inspiration, lĂ ":bksl-nl print(lettre)bksl-nl

A

Z

Cet exemple montre qu'une chaĂźne de caractĂšres est (un peu comme son nom l'indique...) une succession de caractĂšres.

À retenir

La syntaxe générale est :

🐍 Script Python
début du programme
for variable in collection_objets:
    bloc d’instructions Ă  exĂ©cuter un certain nombre (la taille de la collection) de fois
suite du programme
graph LR
A[début]-->B{boucle}
B-->|boucle non terminée| C[instructions dans le for]
B-->|boucle terminée| D[suite du programme]
C-->|répétition|B

Remarquez les points communs avec def et if :

  • le : indispensable Ă  la fin de la ligne du for ;
  • le bloc d’instructions Ă  repĂ©ter est indentĂ©.

Une collection d'objets est appelée un itérable.

Enfin, remarquez qu'il y a trois étapes, un peu cachées :

  • Initialisation : la variable est initialisĂ©e Ă  la premiĂšre valeur de la collection d'objets.
  • Condition : tant que toutes les valeurs de la collection d'objets n'ont pas toutes Ă©tĂ© lues.
  • IncrĂ©mentation : la valeur de variable prendra Ă  chaque itĂ©ration la valeur suivante dans la collection d'objets.

Accumulateurs⚓

Exemple 3

Lisez le script ci-dessous puis, sur papier, trouvez ce qu'il va afficher. Exécutez-le ensuite pour vérifier.

🐍 Script Python
texte = "J'aime "
for fruit in ["pommes", "poires", "cerises"]:
    texte = texte + "les " + fruit + ","
print(texte)
###

Explication

Ici, la boucle a permis de construire progressivement la valeur de la variable texte, prenons le temps de voir comment :

Une variable dont la valeur est constituée grùce à une boucle est parfois appelée un accumulateur.

Attention

Quand vous en utilisez un, n'oubliez pas d'initialiser le ou les accumulateur(s) avant l'entrée dans la boucle (essayez d'enlever texte = "J'aime " pour voir).

ChaĂźne vide etc.

Il est trÚs fréquent d'initialiser un accumulateur à une valeur vide, pour les chaßnes de caractÚres c'est '' (ou ""), pour une somme de nombres c'est 0 et pour un produit ce serait 1.

Exercice 1

Complétez le script suivant pour qu'il multiplie les nombres présents dans la liste liste_nbs :

###
listepy-undnbs = [1, 2, 3, 4, 5, 6]bksl-nlres = ...bksl-nlfor n in listepy-undnbs:bksl-nl res = res py-str ...bksl-nlprint(res)bksl-nl

Exercices

Exercice 2 : compléter un script qui retourne un texte.

Exercice 3 : compléter un script qui duplique les lettres d'un texte.

Exercice 4 : recopier un mot suivant sa taille.

Exercice 5 : souligner des mots.

Exercice 6 : pour les plus rapides.

Exercice 6b : variante du 6 en un peu plus dur.

Boucle et condition⚓

Exemple 4

Essayez de comprendre puis exécutez ce script :

###

texte = "A vaincre sans pĂ©ril, on triomphe sans gloire."bksl-nltextepy-undreduit = ""bksl-nlfor lettre in texte:bksl-nl if lettre not in "aeiouyAEIOUYĂ©ĂšĂȘĂ ": # on peut en trouver d'autres...bksl-nl textepy-undreduit = textepy-undreduit + lettre # ou : textepy-undreduit += lettrebksl-nlprint(textepy-undreduit)bksl-nl

A

Z

Explication

Seules les lettres du texte "A vaincre sans péril, on triomphe sans gloire." qui ne sont pas des voyelles sont ajoutées au texte réduit. Ce script supprime donc les voyelles d'un texte.

Remarquez la double indentation de l'instruction texte_reduit = texte_reduit + lettre (qui est dans le if, lui-mĂȘme dans le for).

Exercice 7

  1. Modifiez le script de l'exemple 4 pour qu'il compte les voyelles dans le texte.
  2. Ecrivez une fonction comptage_voyelles qui prend une chaine de caractĂšres et renvoie le nombre de voyelles.
    Par exemple comptage_voyelles("A vaincre sans péril, on triomphe sans gloire.") donnera 15.

###

Exercices

Exercice 8 : compter le nombre de "i" dans une chaĂźne.

Exercice 9 (variante) : fonction pour compter le nombre d'apparitions d'un caractĂšre dans une chaĂźne.

Exercices

Si vous avez fini le reste :

Exercice 10 : remplacer des voyelles par autre chose.

Exercice 11 : supprimer une lettre sur deux dans une chaĂźne.

La fonction range⚓

Bart a encore eu une punition, il doit recopier 100 fois le texte "Je ne me laisserai pas aller à la facilité". Comme il a du mal a écrire à la main (c'est fatiguant, vous comprenez), il décide d'utiliser un ordinateur :

🐍 Script Python
print("Je ne me laisserai pas aller à la facilité")
print("Je ne me laisserai pas aller à la facilité")
print("Je ne me laisserai pas aller à la facilité")
print("Je ne me laisserai pas aller à la facilité")

mais mĂȘme en utilisant le copier-coller, c'est laborieux...

Sa soeur, qui le prend en pitié, lui dit que les boucles sont utiles pour cela. Il tente alors :

🐍 Script Python
for n in [1, 2, 3, 4, 5, ...]:
    print("Je ne me laisserai pas aller à la facilité")

mais il faut taper tous les entiers jusqu'Ă  100...

Heureusement, la fonction range de Python va l'aider.

Tapez ci-dessous l'instruction list(range(100)). Que remarquez-vous ?

RĂ©ponses
  • la fonction range gĂ©nĂšre une sĂ©quence d'entiers consĂ©cutifs ;
  • l'instruction range(100) gĂ©nĂšre une sĂ©quence de 100 nombres ;
  • le dernier nombre n'est pas 100 mais 99.

Exercice 12

Écrivez une commande qui fera gagner du temps (mais pas forcĂ©ment de la bonne conscience) Ă  Bart.

À retenir

  • Il y a trois syntaxes pour la fonction range :
    • range(n) donne une liste de n nombres entiers, de 0 Ă  n-1 ;
    • range(deb, fin) donne une liste des entiers entre deb inclus jusqu'Ă  fin exclus ;
    • range(deb, fin, pas) donne une liste des entiers entre deb inclus jusqu'Ă  fin exclus, avec un Ă©cart de pas entre chaque.
  • Elle est trĂšs utilisĂ©e avec for pour rĂ©pĂ©ter des instructions un certain nombre de fois.

Exercice 13

Générez avec la fonction range les listes suivantes :

  • 0, 1, 2, ..., 42
  • 42, 43, 44, ..., 75
  • 13, 16, 19, 22, 25, ..., 97

Exercices

Exercice 14 : lecture d'un script.

Exercice 15 : table de multiplication par 3.

Exercice 16 : table de multiplication.

Exercice 17 : somme d'entiers.

Exercice 18 : dessiner un carré avec une tortue !

Exercice 19 : dessiner un escalier avec une tortue !

Exercice

Si vous avez fini les cinq exercices ci-dessus :

Exercice 20 : fonction pour dessiner des carrés quelconques.

Modifiez votre fonction pour qu'elle permette de spécifier la couleur du carré également.

Essayez d'écrire une fonction carré_aléatoire qui dessine un carré de taille, couleur et position aléatoire. Dans une boucle, exécutez cette fonction 20 fois (par exemple).

Petit bĂȘtisier des erreurs courantes sur les boucles for

  1. Le(s) paramĂštre(s) de la fonction range est (sont) toujours entier(s) donc pas de range(5.2), ni de range('abcde'), ni de range(a) oĂč a n'est pas un entier (erreur plus difficile Ă  dĂ©tecter... → nommez mieux vos variables).
  2. Quand vous utilisez un accumulateur, utilisez quelque chose comme ceci :
    🐍 Script Python
    s = 0
    for n in range(20):
        s = s + n
    
    et pas comme cela :
    🐍 Script Python
    s = 0
    for n in range(20):
        s = n
    
    Il est essentiel que vous fassiez la différence entre ces deux scripts !

Boucles imbriquĂ©es⚓

Il est parfois utile de mettre une boucle dans une boucle.

Exemple 1

Affichons toutes les heures possibles :

###

for heure in range(24):bksl-nl for minute in range(60):bksl-nl print("Il est", heure, "heures et", minute, "minutes.")bksl-nl

A

Z

Parfois la variable utilisée pour la deuxiÚme boucle dépend de celle utilisée pour la premiÚre.

Exemple 2

Comment afficher les coordonnées de tous les points du triangle suivant :

points dans un triangle

(on pourrait aussi envisager un traitement sur ces points, par exemple un changement de couleur, un déplacement, etc.)

RĂ©ponse
🐍 Script Python
for x in range(5): # x va de 0 Ă  4
    for y in range(5 - x): # ainsi, quand x vaut 0, y va de 0 Ă  4, etc.
        print("Coordonnées : (", x, ",", y, ")")

Exercice 21

Tables de multiplication .

Exercices

Si vous avez fini, deux exercices (pas forcément sur les boucles imbriquées) :

  1. Exercice 22 : fréquence du six lors de lancers de dés.
  2. Exercice 23 : calcul d'intĂ©rĂȘts composĂ©s.