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/20 21:25] – goupillwiki | nsi:premiere:fonctions_macros [2022/08/28 22:56] (Version actuelle) – goupillwiki | ||
|---|---|---|---|
| Ligne 6: | Ligne 6: | ||
| </ | </ | ||
| - | ===== Exemple de problème | + | ===== Problème |
| - | {{: | + | {{: |
| - | On souhaite réaliser | + | On souhaite réaliser avec le module '' |
| + | |||
| + | Je vous donne la structure | ||
| <code python linenums> | <code python linenums> | ||
| - | from turtle import * # import de la bibliothèque turtle | + | from turtle import * |
| # initialisation | # initialisation | ||
| Ligne 19: | Ligne 21: | ||
| shape(" | shape(" | ||
| pencolor(" | pencolor(" | ||
| - | pensize(4) | + | pensize(2) |
| setheading(0) | setheading(0) | ||
| - | # tracé | + | # tracé |
| - | up() | + | |
| - | goto(0,0) | + | # fin de la zone à compléter |
| - | down() | + | |
| - | for i in range(4): # premier carré | + | |
| - | forward(100) | + | |
| - | left(90) | + | |
| - | up() | + | |
| - | goto(20, | + | |
| - | down() | + | |
| - | for i in range(4): # deuxième carré | + | |
| - | forward(100) | + | |
| - | left(90) | + | |
| - | up() | + | |
| - | goto(40, | + | |
| - | down() | + | |
| - | for i in range(4): # troisième carré | + | |
| - | forward(100) | + | |
| - | left(90) | + | |
| - | # tracé terminé | + | |
| 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> | ||
| - | def deplacer_crayon(x, | ||
| - | """ | ||
| - | Déplace le crayon levé. | ||
| - | x, y: coordonnées de la destination | ||
| - | """ | ||
| - | up() | ||
| - | goto(x,y) | ||
| - | down() | ||
| - | </ | ||
| - | |||
| - | ===== Programme final ===== | ||
| - | |||
| <code python linenums> | <code python linenums> | ||
| - | from turtle import * # import de la bibliothèque turtle | + | from turtle import * |
| - | # 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() | ||
| </ | </ | ||
| Ligne 189: | Ligne 123: | ||
| 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 ===== | ||
| + | |||
| + | === Exercice 1 === | ||
| + | |||
| + | Inspirez-vous de ce qui précède pour tracer la figure ci-dessous. | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | === Exercice 2 === | ||
| + | |||
| + | Cette figure est composées de carrés. Leur taille va diminuant en étant divisée à chaque fois par le nombre d'or : $\varphi = \frac{1 + \sqrt{5}}{2}$. | ||
| + | |||
| + | J'ai numéroté les carré pour que ce soit plus clair. | ||
| + | {{ : | ||
| + | === Exercice 3 === | ||
| + | Écrivez une fonction '' | ||
nsi/premiere/fonctions_macros.1624217118.txt.gz · Dernière modification : de goupillwiki
