SNT Python 2

Identification

Infoforall

4 - Boucle Pour


Voyons maintenant comment réaliser des actions similaires sans avoir à faire trop de copier-coller.

Comment ?

En utilisant des boucles bien entendu.

Boucle pour avec Scratch
Les boucles bornées avec Scratch

Nous allons voir comment faire comprendre cela à l'interpréteur Python.

Vous auriez vraiment envie de faire cela en donnant vous même les coordonnées de chacun de ces segments ?

IDE Python proposé : Thonny

Documents de cours : pdf ou odt.

1 - Cours

Voici un script qui affiche 10 fois le même message à l'écran :

1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Déclaration des CONSTANTES TEXTE = "J'aime bien les copier coller !" # Programme principal print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE) print(TEXTE)
J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller !

Voyons d'abord comment obtenir exactement le même effet mais sans faire de copier-coller.

A° Sauvegarder et lancer le PROGRAMME en utilisant la flèche verte dans Thonny.

1 2 3 4 5 6 7
TEXTE = "J'aime bien les copier coller !" print("C'est parti !") for _ in range(10): print(TEXTE) print("Fini !")
>>> %Run prog_boucle.py C'est parti ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! J'aime bien les copier coller ! Fini !

B° Qu'est-ce qui indique à l'interpréteur Python que l'instruction print("Fini !") n'est pas dans la boucle ?

  1. C'est un coup de chance !
  2. C'est parce qu'on a décalé l'instruction d'exactement 4 espaces !
  3. C'est parce qu'on ne peut faire qu'une instruction en boucle

C° Ligne 4 : quel caractère trouve-t-on à la fin de la déclaration de la boucle ?

D° Poursuivre la séquence de lignes suivies par l'interpréteur lorsqu'il tombe sur ce programme.

1 2 3 4 5 6 7
TEXTE = "J'aime bien les copier coller !" print("C'est parti !") for _ in range(10): print(TEXTE) print("Fini !")

L01 - L02

L04(1er tour)-L05 - ...

...CORRECTION...

1 2 3 4 5 6 7
TEXTE = "J'aime bien les copier coller !" print("C'est parti !") for _ in range(10): print(TEXTE) print("Fini !")

L01 - L02

L04(1er tour)-L05 - L04(2e tour)-L05

L04(3e)-L05 - L04(4e)-L05 - L04(5e)-L05 - L04(6e)-L05

L04(7e)-L05 - L04(8e)-L05 - L04(9e)-L05 - L04(10e)-L05

L07 - fin

1.1 Boucle POUR : réaliser plusieurs fois EXACTEMENT la même action

A - Principe

Pour réaliser plusieurs fois exactement la même série d'actions, il suffit d'utiliser une boucle bornée POUR, qu'on déclare à l'aide du mot-clé for en Python.

B - Exemple
1 2 3 4 5 6 7
print("Avant boucle") # Pas tabulée : avant la boucle for _ in range(3): # Déclaration de la boucle print("A") # Tabulée : dans la boucle print("-- B") # Tabulée : dans la boucle print("Après boucle") # Pas tabulée : avant la boucle

Déroulé du programme

L1
L3 - L4 - L5
L3 - L4 - L5
L3 - L4 - L5
L7

Résultat du programme

Avant boucle A -- B A -- B A -- B Après boucle
C - Sémantique
3
for _ in range(3):

Traduction en français : "Réalise 3 fois le bloc d'instructions indentées"

On peut faire bien mieux que faire exactement la même chose à chaque tour de boucle : on peut faire presque pareil à chaque tour de boucle.

Pour cela, nous allons maintenant donner un nom à la variable de boucle qui est entre le for et le in.

E° Lancer ce nouveau programme.

1 2 3 4 5 6
print("C'est parti !") for v in range(10): print(v) print("Fini !")
>>> %Run prog_boucle.py C'est parti ! 0 1 2 3 4 5 6 7 8 9 Fini !

Questions

  • Combien de boucles ont été réalisées 10 ?
  • Quelle est la première valeur prise par la variable de boucle v ?
  • Quelle est la dernière valeur prise par la variable de boucle v ?

...CORRECTION...

  • Combien de boucles ont été réalisées 10 ?
  • 10

  • Quelle est la première valeur prise par la variable de boucle v ?
  • v référence 0 lors du premier tour de boucle.

  • Quelle est la dernière valeur prise par la variable de boucle v ?
  • v référence 9 lors du dernier tour de boucle.

F° Compléter la séquence des lignes suivies par l'interpréteur.

1 2 3 4 5 6
print("C'est parti !") for v in range(10): print(v) print("Fini !")

L01

L03(v=0)-L04 - ...

...CORRECTION...

1 2 3 4 5 6
print("C'est parti !") for v in range(10): print(v) print("Fini !")

L01

L03(v=0)-L04 - L03(v=1)-L04

L03(v=2)-L04 - L03(v=3)-L04 - L03(v=4)-L04 - L03(v=5)-L04

L03(v=6)-L04 - L03(v=7)-L04 - L03(v=8)-L04 - L03(v=9)-L04

L06 - fin

1.2 Boucle POUR : réaliser plusieurs fois PRESQUE la même action

A - Valeurs successives de la variable de boucle

On réalise des actions un peu différentes car utilisant une variable de boucle dont le nom se situe derrière le mot clé for.

for k in range(5):

Sur cet exemple :

  • k est la variable de boucle.
  • k commence à 0
  • k est incrémentée de 1 à chaque tour de boucle.
  • Ainsi, k va prendre les valeurs 0 puis 1 puis 2 puis 3 puis 4.

Attention

  • k n'ira pas jusqu'à 5, c'est une borne exclue.
  • 5 correspond au nombre de tours de boucle effectués : 0-1-2-3-4.
  • La valeur finale de k est 4, obtenue en calculant (5 - 1).
B - Déroulé d'une boucle avec variable de boucle
1 2 3 4 5 6 7
print("Avant boucle") for k in range(3): # Pour k variant de 0 à 2 print("A") # Affiche le string "A" print(k) # Affiche le contenu de k print("Après boucle")

Déroulé du programme

L1
L3(k=0) - L4 - L5
L3(k=1) - L4 - L5
L3(k=2) - L4 - L5
L7

Résultat du programme

Avant boucle A 0 A 1 A 2 Après
C - Sémantique
3
for k in range(3):

Traduction en français : "Pour chaque valeur de k dans [0, 1, 2], réalise le bloc d'instructions indentées"

2 - Exercices

01° Créer un programme qui affiche 1000 fois "Trop facile en programmant". Fournir la séquence des lignes suivies pour écrire les 3 premiers texte.

...CORRECTION...

1 2 3
TEXTE = "Trop facile en programmant" for _ in range(1000): print(TEXTE)

1 - 2-3 - 2-3 - 2-3...

02° Créer un programme qui affiche 10 lignes qui contiennent chacune 40 étoiles *.

...CORRECTION...

1 2 3
TEXTE = "*" * 40 for _ in range(10): print(TEXTE)

03° Modifier uniquement ... dans le programme pour afficher les nombres 0, 10, 20, 30, 40, 50... jusqu'à 100.

1 2 3 4 5 6
print("C'est parti !") for k in range(11): ... print("Fini !")

...CORRECTION...

1 2 3 4 5 6
print("C'est parti !") for k in range(11): print(k * 10) print("Fini !")
>>> %Run prog_boucle.py C'est parti ! 0 10 20 30 40 50 60 70 80 90 100 Fini !

04° Créer un programme qui affiche 0 étoile, puis 1 étoile, puis 2 étoiles... jusqu'à 10 étoiles.

Attention, je veux 10 étoiles, pas 9 !

...CORRECTION...

1 2
for v in range(11): print("*" * v)
>>> %Run prog_boucle.py * ** *** **** ***** ****** ******* ******** ********* **********

✌ 05° Compléter ce code en remplaçant les ... par ce qu'il faut pour parvenir à réaliser la somme des nombres allant de 0 à 100.

On veut donc calculer 0 + 1 + 2 + 3 + ... + 98 + 99 + 100.

1 2 3 4 5 6
somme = ... for x in range(...): somme = ... + ... print(somme)

Un peu de graphisme maintenant.

06° Utiliser ce programme qui trace un triangle en réalisant trois fois EXACTEMENT la même série d'actions : avance et tourne de 120°. On notera que 120° * 3 donne 360°.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from turtle import * couleur_choisie = "#33AAFF" taille = 50 x = 0 y = 0 # Choix du feutre color(couleur_choisie) pensize(5) # Déplacement du crayon penup() goto(x, y) pendown() # Dessin d'un carré for _ in range(3): forward(taille) left(120)

...CORRECTION...

Résultat du programme précédent

07° Modifier le programme précédent pour qu'il trace un carré en réalisant quatre fois EXACTEMENT la même série d'actions : avance et tourne de 90°. On notera que 90° * 4 donne 360°.

Résultat attendu

...CORRECTION...

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from turtle import * couleur_choisie = "#33AAFF" taille = 50 x = 0 y = 0 # Choix du feutre color(couleur_choisie) pensize(5) # Déplacement du crayon penup() goto(x, y) pendown() # Dessin d'un carré for _ in range(4): forward(taille) left(90)

On peut aussi réaliser quatre fois presque la même série d'actions. Traçons par exemple des côtés de plus en plus grand.

08° Utiliser ce programme pour visualiser le résultat puis répondre aux questions.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from turtle import * couleur_choisie = "#33AAFF" taille = 25 x = 0 y = 0 # Choix du feutre color(couleur_choisie) pensize(5) # Déplacement du crayon penup() goto(x, y) pendown() # Dessin d'un carré for k in range(16): forward(taille * k) left(90)

Questions

  1. Que vaut la longueur du trait lors du premier tour de boucle (attentiona au "piège" si vous n'êtes pas attentif).
  2. Quelles sont les longueurs effectuées sur les 4 premiers tours de boucle ?
  3. Modifier le programme pour que la longueur du trait soit taille * (k + 1)
  4. Cette fois, quelles sont les longueurs effectuées sur les 4 premirs tours de boucle ?

...CORRECTION...

Résultat du programme précédent

Lors du premier tour de boucle, k vaut 0. Le crayon avance donc de 25 * 0, soit 0 pixel !

Sur les 4 premiers tours, on a donc 0, 25, 50 et 75 pixels de longueurs de trait.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
from turtle import * couleur_choisie = "#33AAFF" taille = 25 x = 0 y = 0 # Choix du feutre color(couleur_choisie) pensize(5) # Déplacement du crayon penup() goto(x, y) pendown() # Dessin d'un carré for k in range(16): forward(taille * (k + 1)) left(90)
AVANT MODIF - APRES MODIF

Cette fois, le premier trait fait 25 pixels et les suivants 50, 75 et 100. On trace quelque chose dès le début.

On peut encore faire mieux : faire plusieurs fois la même chose mais à l'intérieur d'une boucle qui réalise elle presque la même chose...

Ici, la première boucle externe va permettre de modifier les coordonnées et la deuxième boucle interne va permettre de tracer des carrés.

09 (difficile)° Utiliser ce programme pour visualiser le résultat puis répondre aux questions.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
from turtle import * couleur_choisie = "#33AAFF" taille = 25 x = -200 y = 0 # Choix du feutre color(couleur_choisie) pensize(5) for colonne in range(20): # BOUCLE EXTERNE # Déplacement du crayon penup() goto(x + taille*colonne, y) pendown() # Dessin d'un carré for _ in range(4): # BOUCLE INTERNE forward(taille) left(90)

Questions

  1. Quelles sont les coordonnées du premier carré tracé ?
  2. Quelles sont les coordonnées des trois suivants ?
  3. Pourquoi la deuxième boucle est décalée de 4 espaces ?
  4. Donner les lignes suivies par l'interpréteur pour réaliser les 2 premiers carrés.

...CORRECTION...

Résultat du programme précédent
  1. Quelles sont les coordonnées du premier carré tracé ?
  2. On voit goto(x + taille*colonne, y) en ligne 17.

    Cela veut dire que les coordonnées dépendent de colonne.

    Lors du premier tour, colonne vaut 0. Donc on aura un carré en (-200 + 25*0, 0) soit (-200, 0).

  3. Quelles sont les coordonnées des trois suivants ?
  4. colonne vaut alors 1, puis 2 puis 3.

    (-200 + 25*1, 0) soit (-175, 0)

    (-200 + 25*2, 0) soit (-150, 0)

    (-200 + 25*3, 0) soit (-125, 0)

  5. Pourquoi la deuxième boucle est décalée de 4 espaces ?
  6. Car elle appartient à la première : on va réaliser la deuxième boucle à chaque tour de boucle de la première boucle...

  7. Donner les lignes suivies par l'interpréteur pour réaliser les 2 premiers carrés.
  8. L01 - L03 - L04 - L05 - L06 - L09 - L10

    L13(colonne=0) - L16 - L17 - L18 - L21-L22-L23 - L21-L22-L23 -L21-L22-L23 -L21-L22-L23

    L13(colonne=1) - L16 - L17 - L18 - L21-L22-L23 - L21-L22-L23 -L21-L22-L23 -L21-L22-L23

10 (difficile)° Modifier le programme pour réaliser cet affichage.

Résultat du programme précédent
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
from turtle import * couleur_choisie = "#33AAFF" taille = 25 x = -200 y = -200 # Choix du feutre color(couleur_choisie) pensize(5) for colonne in range(20): # BOUCLE EXTERNE for ...: # Déplacement du crayon penup() goto(x + taille*colonne, ...) pendown() # Dessin d'un carré for _ in range(4): # BOUCLE INTERNE forward(taille) left(90)

...CORRECTION...

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
from turtle import * couleur_choisie = "#33AAFF" taille = 25 x = -200 y = -200 # Choix du feutre color(couleur_choisie) pensize(5) for colonne in range(20): # BOUCLE EXTERNE for ligne in range(20): # Déplacement du crayon penup() goto(x + taille*colonne, y + taille*ligne) pendown() # Dessin d'un carré for _ in range(4): # BOUCLE INTERNE forward(taille) left(90)

En conclusion, voici le code permettant de créer l'image de l'introduction.

Vous auriez vraiment envie de faire cela sans boucle ?
1 2 3 4 5 6 7 8 9 10
import turtle as trt couleurs = ["gold", "white", "blue" ] crayon = trt.Turtle() crayon.speed(0) trt.bgcolor('black') for x in range(800): crayon.pencolor(couleurs[x % 3]) crayon.width(x//100 + 1) crayon.forward(x) crayon.left(59)

Comme vous le voyez, il vous manque encore quelques notions inconnues, comme ces mystérieux crochets des lignes

3 - Py-rates

06° Connectez-vous sur le site py-rates.fr. Choisissez votre personnage, et notez bien le numéro qui vous permettra de continuer de chez vous.

Il vous reste à passer les niveaux 1, 2 et 3.

Activité publiée le 08 12 2022
Dernière modification : 08 12 2022
Auteur : ows. h.