✔ Intro A (Mise en place)° Réaliser les actions suivantes :
Ouvrir Thonny. Réduire la fenêtre de Thonny et de votre navigateur Web pour que chaque fenêtre occupe la moitié de l'écran.
Ouvrir votre dossier/répertoire personnel. Créer dans le dossier SNT un nouveau sous-dossier qu'on nommera python04.
Sur Windows : vérifier via le menu affichage de votre explorateur de dossiers que vous avez bien coché la case "Afficher les extensions".
✔ Intro B° Placer ce programme dans la zone de programmation. Sauverger sous le nom boucle.py. Lancer. Il permet d'afficher 5 fois la même séquence de message.
1
2
3
4
5
6
7
8
9
10
11
12
13
texte="J'aime bien les copier coller !"texte2="Oui, oui."print(texte)print(texte2)print(texte)print(texte2)print(texte)print(texte2)print(texte)print(texte2)print(texte)print(texte2)
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
Cela fonctionne bien. Mais si on veut le faire un million de fois, avez-vous envie de faire autant de copier-coller que cela ?
✔ Intro C° Utilisez ce nouveau programme en utilisant la flèche verte dans Thonny.
1
2
3
4
5
6
7
8
9
10
texte="J'aime bien les copier coller !"texte2="Oui, oui."print("C'EST PARTI !")for_inrange(5):print(texte)print(texte2)print("FINI !")
>>>%Run prog_boucle.py C'EST PARTI !
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
J'aime bien les copier coller !
Oui, oui.
FINI !
Questions-réponses
Où signale-t-on à Python qu'on veut agir 5 fois en boucle ? En ligne 6.
6
for_inrange(5):
Que trouve-t-on à la fin de la ligne de déclaration du for , la ligne 6 ? Python attend TOUJOURS le caractère :.
Qu'est-ce qui semble indiquer à Python que les instructions des lignes 7-8 sont à réaliser en boucle ? Les deux lignes 7-8 sont décalées de 4 espaces EXACTEMENT. Ce décalage se nomme la TABULATION.
7
8
␣␣␣␣print(texte)␣␣␣␣print(texte2)
✔ Intro D° Observer bien la ligne 5 : print("Fini !").
1
2
3
4
5
6
7
8
9
10
texte="J'aime bien les copier coller !"texte2="Oui, oui."print("C'EST PARTI !")for_inrange(5):print(texte)print(texte2)print("FINI !")
QCM : comment Python a-t-il compris que cette ligne n'appartenait pas à la boucle ?
C'est un coup de chance !
C'est parce qu'on n'utilise plus le décalage de 4 espaces.
C'est parce qu'on ne peut faire que deux instructions en boucle
C'est à cause de la ligne 9 qui est vide.
La réponse est bien entendu la réponse B : C'est parce qu'on est revenu sur la même colonne que le for, elle n'est pas décalé de 4 espaces.
✔ Intro E° Poursuivre dans votre tête la séquence de lignes proposées si dessous : il s'agit des lignes suivies par l'interpréteur lorsqu'il tombe sur ce programme, plus court :
1
2
3
4
5
6
7
texte="J'aime bien les copier coller !"print("C'est parti !")for_inrange(3):print(texte)print("Fini !")
L01 - L02
L04(1er tour)-L05 - ...
Vérifiez votre solution en cliquant sur la solution ci-dessous.
...CORRECTION...
1
2
3
4
5
6
7
texte="J'aime bien les copier coller !"print("C'est parti !")for_inrange(3):print(texte)print("Fini !")
L01 - L02
L04(1er tour)-L05
L04(2e tour)-L05
L04(3e tour)-L05
L07 - fin
Mais, on peut faire bien mieux que faire exactement la même chose à chaque tour de boucle : on peut faire presque la même chose à chaque tour de boucle.
✔ Intro F° Nous allons maintenant donner un vrai nom à la variable de boucle située entre le for et le in. Ici, nous utiliserons k par exemple. Lancer ce nouveau programme.
1
2
3
4
5
6
print("C'est parti !")forkinrange(10):print(k)print("Fini !")
>>>%Run prog_boucle.py C'est parti !
0
1
2
3
4
5
6
7
8
9
Fini !
Questions-réponses
Combien de boucles ont été réalisées ? 10.
Quelle est la première valeur prise par la variable de boucle v ? 0.
Quelle est la dernière valeur prise par la variable de boucle v ? 9.
Attention donc : nous retrouvons l'histoire du décalage à cause du fait qu'on commence 0. Si vous notez range(4), vous allez bien faire 4 tours de boucle mais la variable de boucle prendra les valeurs 0,12,3.
✔ Intro G° Compléter dans votre tête la séquence des lignes suivies par l'interpréteur. Vérifiez ensuite avec la correction.
1
2
3
4
5
6
print("C'est parti !")forvinrange(4):print(v*100)print("Fini !")
L01
L03(v=0)-L04(affiche 0) - ...
...CORRECTION...
1
2
3
4
5
6
print("C'est parti !")forvinrange(4):print(v*100)print("Fini !")
L01
L03(v=0)-L04(affiche 0)
L03(v=1)-L04(affiche 100)
L03(v=2)-L04(affiche 200)
L03(v=3)-L04(affiche 300)
L06 - fin
Si vous êtes en TP, passez directement à la partie 2 suivante, sans lire les deux bilans ci-dessous : ils seront analysés oralement à la fin du TP.
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 bouclefor_inrange(3):# Déclaration de la boucleprint("A")# Tabulée : dans la boucleprint("-- B")# Tabulée : dans la boucleprint("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 boucleA-- BA-- BA-- BAprès boucle
C - Sémantique
3
for_inrange(3):
Traduction en français : "Réalise 3 fois le bloc d'instructions indentées"
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.
forkinrange(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 néanmoins bien au nombre de tours de boucle effectuées : 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")forkinrange(3):# Pour k variant de 0 à 2print("A")# Affiche le string "A"print(k)# Affiche le contenu de kprint("Après boucle")
Créer un programme qui affiche 1000 fois "Trop facile en programmant".
Fournir la séquence des lignes suivies pour écrire les 3 premiers textes.
Trop facile en programmant
Trop facile en programmant
Trop facile en programmant
...
...CORRECTION...
1
2
3
texte="Trop facile en programmant"for_inrange(1000):print(texte)
1 - 2-3 - 2-3 - 2-3...
⚙ 02° Créer un string qui contient 40 symboles étoiles *. Le plus facile est encore de le créer à l'aide d'une répétition. Finaliser le programme pour qu'il affiche 10 lignes qui contiennent chacune 40 étoiles *.
Comment se nomme la variable qui va stocker progressivement les valeurs qu'on ajoute ?
Compléter la ligne 15 pour afficher le résultat final.
...CORRECTION...
La variable est bien entendu somme.
Il suffit de noter ceci en ligne 15 : print(somme)
✎ 05-B° Nous voudrions maintenant faire la somme des entiers de 0 à 100 et nous n'avons pas trop envie de faire 100 incrémentations. Compléter les ... ci-dessous pour permettre au programme de faire son travail. Pour cela, quelques questions qui devraient vous aider :
L03 : comment se nomme la variable de boucle qui aura 0 comme valeur lors du premier tour, puis 1, puis 2, ect... ?
L03 : que faut-il mettre dans les parenthèses de la fonction range() pour aller jusqu'à 100 ?
L04 : pour obtenir l'équivalent des lignes 3 à 13 de la question 05-A, que faut-il rajouter à somme à chaque tour de boucle ? 0, 1, 2, v, somme ou 10
Un peu de graphisme maintenant. Commençons par voir (ou revoir pour certains d'entre vous) comment parvenir à demander à la tortue d'avancer tout droit ou de tourner de quelques degrés.
Si vous regardez l'écran de turtle, vous pourrez constater qu'on y voit une sorte de flèche : elle indique la direction vers laquelle pointe la tortue.
Initialement, la tortue pointe vers la droite (angle 0°).
Avancer avec forward()
Cette fonction permet de faire avancer la tortue dans la direction qu'elle regarde en partant de sa position actuelle.
On doit lui transmettre la distance en pixels.
1
2
3
4
5
6
fromturtleimport*dot(15)forward(50)# veut dire d’avancer de 50 pixels.dot(15)forward(100)# veut dire d’avancer de 100 pixels.
Tourner avec left()
Cette fonction permet de faire tourner la tortue sur place en fournissant un angle en degrés. Elle tourne sur elle-même vers la gauche, en sens anti-horaire donc.
1
2
3
4
5
6
7
fromturtleimport*dot(15)forward(50)# veut dire d’avancer de 50 pixels.dot(15)left(90)# rotation à angle droitforward(100)# veut dire d’avancer de 100 pixels.
Tourner avec right()
Cette fonction permet de faire tourner la tortue sur place en fournissant un angle en degrés. Elle tourne sur elle-même vers la droite, en sens horaire donc.
1
2
3
4
5
6
7
fromturtleimport*dot(15)forward(50)# veut dire d’avancer de 50 pixels.dot(15)right(90)# rotation à angle droitforward(100)# veut dire d’avancer de 100 pixels.
✔ 06-A° Voici un programme qui trace un triangle en réalisant trois fois EXACTEMENT la même action : avance et tourne de 120°.
fromturtleimport*couleur_choisie="#33AAFF"taille=50x=0y=0# Choix du feutrecolor(couleur_choisie)pensize(5)# Déplacement du crayonpenup()goto(x,y)pendown()# Dessin d'un carréfor_inrange(3):forward(taille)left(120)
Résultat du programme ci-dessus
Actions à réaliser
Lancer le programme.
Modifiez les contenus des variables des lignes 3-4-5-6 pour constater que cela a bien un impact sur le dessin.
✎ 06-B° Ecrire la succession de lignes que va emprunter l'interpréteur Python lorsqu'il va exécuter le programme précédent.
Attention, certaines doivent apparaître plusieurs fois puisqu'il y a une boucle.
⚙ 06-C° Modifier les lignes 18 et 20 du programme précédent pour qu'il trace plutôt un carré en réalisant quatre fois EXACTEMENT la même action : avance et tourne de 90°. On notera que 90° * 4 donne 360°.
fromturtleimport*couleur_choisie="#33AAFF"taille=50x=0y=0# Choix du feutrecolor(couleur_choisie)pensize(5)# Déplacement du crayonpenup()goto(x,y)pendown()# Dessin d'un carréfor_inrange(4):forward(taille)left(90)
⚙ 07-A° Traçons maintenant des côtés de plus en plus grands : on réalise donc presque la même action. Nous allons donc utiliser la valeur de la variable de boucle notée k ici, différente à chaque tour :
Utiliser ce programme pour visualiser le résultat, puis répondre aux questions.
fromturtleimport*couleur_choisie="#33AAFF"taille=25x=0y=0# Choix du feutrecolor(couleur_choisie)pensize(5)# Déplacement du crayonpenup()goto(x,y)pendown()# Dessin d'un carréforkinrange(16):forward(taille*(k + 1))left(90)
Questions
Lors du premier tour :
(L18) Que vaut la variable de boucle k ?
(L19) De combien de pixels avance-t-on lors du premier tour ?
Lors du deuxième tour :
(L18) Que vaut la variable de boucle k ?
(L19) De combien de pixels avance-t-on lors du premier tour ?
Lors du troisième tour :
(L18) Que vaut la variable de boucle k ?
(L19) De combien de pixels avance-t-on lors du premier tour ?
...CORRECTION...
Résultat du programme précédent
k vaut 0 puis k vaut 1 puis k vaut 2 puis k vaut 3.
On calcule alors les longueurs en utilisant la ligne 19 : taille*(k + 1)
Lorsque k vaut 0, la longueur vaut 25*(0+1) = 25
Lorsque k vaut 1, la longueur vaut 25*(1+1) = 50
Lorsque k vaut 2, la longueur vaut 25*(2+1) = 75
⚙ 07-B° Modifiez l'angle de rotation de la ligne 20 :
Placez 120 et lancez.
Placez 240 et lancez.
Placez 210 et lancez.
Question : la dernière forme est-elle réellement plus complexe à décrire que les autres ou s'agit-il uniquement d'une illusion de complexité si on utilise le mauvais langage de description ?
...CORRECTION...
Le langage humain donnerait effectivement à la dernière forme l'illusion d'une forme complexe car nous serions bien ennuyés pour la décrire précisément.
En réalité, en utilisant le bon langage de description, on se rend compte que ces formes sont toutes équivalentes puisque dans le code permettant de les dessiner seule la valeur change.
Le dessin de l'introduction.
⚙ 08° En conclusion, voici le code permettant de créer l'image de l'introduction.
Lancer le code et modifier quelques couleurs ou valeurs pour observer les changements.
Vous auriez vraiment envie de faire cela sans boucle ?
Voici des valeurs qu'on pourrait prendre par exemple. Comment se fait-il qu'on ait parfois l'impression de voir du jaune au centre de la forme lors de la réalisation du dessin ?
Vous savez qu'une image est une succession de petits carrés nommés pixels.
Vous savez que chaque couleur de pixel est définie par sa décomposition RGB : Red Green Blue.
Nous allons voir qu'on peut accéder à chaque pixel et modifier les valeurs RGB.
✔ 09-A° L'utilisation de boucles imbriquées va nous permettre d'atteindre chaque pixel d'une image.
1
2
3
4
5
6
fromturtleimport*forligneinrange(15):forcolonneinrange(15):goto(colonne*20,ligne*20)# partons au bon endroitdot(18)# plaçons un pixel unique
Le code ci-dessus veut dire ceci : "Pour chaque ligne, parcours chaque colonne de cette ligne pour y placer un point".
Lancer le code et visualiser que la phrase en gras correspond bien à ce qu'on visualise.
⚙ 09-B° Modifier le programme pour lui demander plutôt ceci : "Pour chaque COLONNE, parcours chaque LIGNE de cette colonne pour y placer un point".
...CORRECTION...
1
2
3
4
5
6
fromturtleimport*forcolonneinrange(50):forligneinrange(50):goto(colonne*20,ligne*20)# partons au bon endroitdot(1)# plaçons un pixel unique
✔ 10° Réaliser ces deux actions :
Vérifier que vous avez bien activé la visualisation des extensions si vous êtes sur Windows (explorateur de fichiers, menu affichage).
Télécharger l'image suivante en la plaçant dans votre dossier python04. Vous nommerez l'image mm.jpg, comme Marilyn Monroe, dont le portrait fut utilisé par le célèbre artiste Andy Warhol.
✔ 11° Réaliser ces actions :
Aller sur python.infoforall.fr.
Cliquer sur l'icône représentant un dossier, à côté de l'icône EXECUTER.
Sélectionner votre image mm.jpg.
Placer ce script dans la zone de programmation puis cliquer sur EXECUTER.
1
2
3
4
5
fromPILimportImage# Pour charger le module PIL gérant les imagesimage=Image.open("mm.jpg")# Pour gérer cette image via la variable Python nommée imageimage.show()# Pour afficher cette imageimage.close()# Pour fermer proprement le fichier
Une fois le programme terminé, un bouton devrait clignoter en jaune : il vous suffit de cliquer dessous et vous devriez voir apparaître votre image.
✔ 12° Dans ce nouveau script, nous allons demander à Python :
Pour chaque colonne de cette image (Ligne 5)
Pour chaque ligne de cette image (Ligne 6)
Récupère les valeurs rgb du pixel actuel (Ligne 7)
Modifie ce pixel en inversant les intensités du rouge et bleue (Ligne 8)
Placer ce nouveau script dans la zone de programmation puis cliquer sur EXECUTER.
Réaliser un filtre bleu qui ne laisse passer que le bleu.
⚙ 15° Compléter les ... de ce dernier programme : nous voulons obtenir une image grisée : pour cela, on va devoir calculer la moyenne des trois composantes rouge, vert, bleu et placer cette valeur sur les trois composantes RGB. Puisqu'elles auront la même valeur, nous allons percevoir des nuances de gris.
fromPILimportImageimage=Image.open("mm.jpg")forcolonneinrange(image.width):forligneinrange(image.height):r,g,b=image.getpixel((colonne,ligne))m = (r + g + b) // 3
image.putpixel((colonne,ligne),(m,m,m))image.show()image.close()
✎ 16° Connectez-vous sur le site py-rates.fr ou py-rates.org. Choisissez votre langue en haut à droite, puis votre personnage, et notez bien le numéro qui vous permettra de continuer de chez vous.
Il vous reste à fournir les codes permettant de passer les niveaux 1, 2 et 3.