nsi:premiere:fonctions_macros
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| nsi:premiere:fonctions_macros [2021/06/21 12:05] – goupillwiki | nsi:premiere:fonctions_macros [2022/08/28 22:56] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 8: | Ligne 8: | ||
| ===== Problème ===== | ===== Problème ===== | ||
| - | {{: | + | {{: |
| - | On souhaite réaliser avec le module '' | + | On souhaite réaliser avec le module '' |
| Je vous donne la structure de fichier de base, à compléter. | Je vous donne la structure de fichier de base, à compléter. | ||
| Ligne 21: | Ligne 21: | ||
| shape(" | shape(" | ||
| pencolor(" | pencolor(" | ||
| - | pensize(4) | + | pensize(2) |
| setheading(0) | setheading(0) | ||
| # tracé - à compléter | # tracé - à compléter | ||
| - | # tfin de la zone à compléter | + | # fin de la zone à compléter |
| exitonclick() | exitonclick() | ||
| </ | </ | ||
| - | On identifie facilement les morceaux de codes dessinant les carrés. Ils sont 3 fois identiques : lignes 12-14 ; 18 - 20 ; 24 - 26. | + | <WRAP clear/> |
| - | Cette façon de faire a deux gros défauts : | + | Complétez |
| - | * On est obligé de réécrire plusieurs fois la même chose, | + | |
| - | * On ne voit pas clairement ce que fait le programme. | + | |
| - | ===== Utiliser | + | ===== Utiliser |
| - | L'idée est d'associer un nom au bloc | + | > Peut-être avez-vous déjà eu la bonne idée d'utiliser des fonctions. Dans ce cas, bravo. Comme il s'agit de bien vous faire comprendre, je poursuis en supposant que vous n'y avez pas pensé / n'avez pas su le faire. |
| - | <code python linenums> | + | Nous avons trois carrés de taille |
| - | for i in range(4): | + | |
| - | forward(100) | + | |
| - | left(90) | + | |
| - | </ | + | |
| - | + | ||
| - | De préférence, un nom qui parle et qui évite des explications. | + | |
| + | <WRAP group> | ||
| + | <WRAP half column> | ||
| <code python linenums> | <code python linenums> | ||
| - | def tracer_carre_100(): | + | forward(100) |
| - | for i in range(4): | + | left(90) |
| - | forward(100) | + | forward(100) |
| - | left(90) | + | left(90) |
| + | forward(100) | ||
| + | left(90) | ||
| + | forward(100) | ||
| + | left(90) | ||
| </ | </ | ||
| - | |||
| - | Le rôle des '' | ||
| - | |||
| - | <WRAP info> | ||
| - | La ligne de la définition, | ||
| </ | </ | ||
| - | + | <WRAP half column> | |
| - | Vous comprenez qu' | + | ou mieux : |
| - | + | ||
| - | === Rendre la fonction plus générale === | + | |
| - | + | ||
| - | Notre fonction ne sait tracer que des carré de côté 100. Que ferons nous si nous voulons tracer un carré de côté 50 ? Faudra-t-il définir une autre fonction ? | + | |
| - | + | ||
| - | Bien sûr que non. On peut fournir à la fonction un **argument** qui agit comme un paramètre de réglage de la fonction. | + | |
| <code python linenums> | <code python linenums> | ||
| - | def tracer_carre(taille): | + | for i in range(4): |
| - | | + | forward(100) |
| - | forward(taille) | + | left(90) |
| - | left(90) | + | |
| </ | </ | ||
| - | Lorsque l'on appellera la fonction, il faudra fournir une valeur pour '' | + | Dans les deux cas, on doit reproduire 3 fois ce morceau de code. On voit bien que ce n'est pas idéal. |
| + | </ | ||
| + | </ | ||
| - | === Documenter la fonction === | + | Ce qu'il serait plus naturel de faire c'est : |
| - | Pour rendre le programme encore plus clair, on documente la fonction, c'est à dire que l'on ajoute un commentaire juste après la signature. | + | < |
| - | + | se positionner, | |
| - | < | + | tracer |
| - | def tracer_carre(taille): | + | se positionner, |
| - | """ | + | tracer un carré de taille |
| - | | + | se positionner, |
| - | | + | tracer un carré de taille 100 |
| - | """ | + | |
| - | for i in range(4): | + | |
| - | | + | |
| - | left(90) | + | |
| </ | </ | ||
| + | Aucune de ces lignes ne correspond à une instruction disponible dans le langage, même en tenant compte des fonctions supplémentaires apportées par la bibliothèque '' | ||
| - | ===== Utiliser une fonction pour le déplacement de crayon ===== | + | Il faut les définir. Reprenez le programme en complétant |
| - | + | ||
| - | Le bloc correspondant au déplacement de crayon levé se retrouve aussi beaucoup. | + | |
| - | On peut lui associer une macro. Mais il y a une différence : le crayon ne se déplace pas toujours au même endroit. | + | |
| - | + | ||
| - | <code python linenums> | + | |
| - | def deplacer_crayon(x, | + | |
| - | up() | + | |
| - | goto(x,y) | + | |
| - | down() | + | |
| - | </ | + | |
| - | + | ||
| - | C'est donc l' | + | |
| <WRAP tip> | <WRAP tip> | ||
| - | Nous voulions nommer la fonction " | + | Les fonctions doivent être définies avant qu'on les appelle. Elles sont donc définies |
| - | * '' | + | |
| - | * '' | + | |
| </ | </ | ||
| - | |||
| - | === Documenter la fonction === | ||
| - | |||
| - | Pour rendre le programme encore plus clair, on documente la fonction, c'est à dire que l'on ajoute un commentaire juste après la signature. | ||
| <code python linenums> | <code python linenums> | ||
| - | def deplacer_crayon(x, | + | from turtle import * |
| - | """ | + | |
| - | Déplace le crayon levé. | + | |
| - | x, y: coordonnées de la destination | + | |
| - | """ | + | |
| - | up() | + | |
| - | goto(x,y) | + | |
| - | down() | + | |
| - | </ | + | |
| - | + | ||
| - | ===== Programme final ===== | + | |
| - | + | ||
| - | + | ||
| - | <code python linenums> | + | |
| - | from turtle import * # import de la bibliothèque turtle | + | |
| - | # définitions | + | # définition |
| - | def tracer_carre(taille): | + | def tracer_carre(taille:int): |
| """ | """ | ||
| - | | + | taille: |
| - | | + | |
| """ | """ | ||
| - | | + | |
| - | forward(taille) | + | |
| - | left(90) | + | |
| - | def deplacer_crayon(x,y): | + | def positionner_crayon_sans_tracer(x:int, y:int): |
| """ | """ | ||
| - | Déplace le crayon levé. | ||
| x, y: coordonnées de la destination | x, y: coordonnées de la destination | ||
| + | amène le crayon à la position (x,y) sans tracer | ||
| """ | """ | ||
| - | | + | |
| - | | + | |
| - | down() | + | # initialisations de l' |
| - | + | ||
| - | # initialisation | + | |
| speed(5) | speed(5) | ||
| shape(" | shape(" | ||
| pencolor(" | pencolor(" | ||
| - | pensize(4) | + | pensize(2) |
| setheading(0) | setheading(0) | ||
| - | # tracé | + | # programme principal |
| - | deplacer_crayon(0,0) | + | positionner_crayon_sans_tracer(0,0) |
| tracer_carre(100) | tracer_carre(100) | ||
| - | deplacer_crayon(20,20) | + | positionner_crayon_sans_tracer(20,20) |
| tracer_carre(100) | tracer_carre(100) | ||
| - | deplacer_crayon(40,40) | + | positionner_crayon_sans_tracer(40,40) |
| tracer_carre(100) | tracer_carre(100) | ||
| - | #tracé terminé | + | |
| + | # fin | ||
| exitonclick() | exitonclick() | ||
| </ | </ | ||
| voilà qui est plus simple à comprendre ! | voilà qui est plus simple à comprendre ! | ||
| + | |||
| + | <WRAP tip> | ||
| + | Les fonctions définies ici ne renvoies rien. Elles se contentent de faire quelque chose. De telles fonctions sont appelées **procédures**. En Python, si une fonction arrive à son terme sans qu' | ||
| + | </ | ||
| ===== Exercices ===== | ===== Exercices ===== | ||
| Ligne 178: | Ligne 131: | ||
| === Exercice 1 === | === Exercice 1 === | ||
| - | Inspirez-vous de ce qui précède pour tracer la figure ci-dessous. Les carrés ont des tailles de 100, 80, 60 et 40. | + | Inspirez-vous de ce qui précède pour tracer la figure ci-dessous. |
| - | {{ : | + | {{ : |
| === Exercice 2 === | === Exercice 2 === | ||
| Ligne 188: | Ligne 141: | ||
| J'ai numéroté les carré pour que ce soit plus clair. | J'ai numéroté les carré pour que ce soit plus clair. | ||
| - | {{ : | + | {{ : |
| === Exercice 3 === | === Exercice 3 === | ||
| Écrivez une fonction '' | Écrivez une fonction '' | ||
nsi/premiere/fonctions_macros.1624269909.txt.gz · Dernière modification : de goupillwiki
