Dans cette leçon, nous allons approfondir le concept de la fonction. Dans la leçon 3 sur les fonctions simples, nous avons vu la fonction comme une façon de donner un nom à une séquence d'instructions. Ici nous allons voir comment nous pouvons ajouter un ou plusieurs paramètres à une fonction. Nous allons voir que :
- l'expression `def rect(d, e):` permet de définir une fonction avec deux paramètres,
- les paramètres `d, e` sont des variables locales valides uniquement à l'intérieur de la définition de fonction,
- ces paramètres prennent une valeur au moment de l'appel de la fonction avec `rect(50, 30)`.
Jusqu'à maintenant, notre rectangle était d'une taille fixe. La fonction `rectangle()` de la leçon 3 sur les fonctions simples
```python
defrectangle():
forward(160)
left(90)
forward(100)
left(90)
forward(160)
left(90)
forward(100)
left(90)
```
dessine toujours un rectangle de 160 x 100 pixels. Il faudrait faire une nouvelle fonction `rectangle2()` si on voulait dessiner une taille différente.
Il serait très utile de disposer d'une fonction de la forme `rectangle(d, e)` qui puisse dessiner des rectangles de largeur et hauteur variable.
C'est possible en spécifiant des **paramètres** pour la fonction.
Un paramètre de fonction est une **variable locale** qui peut être utilisée dans sa définition.
Lors de l'appel de la fonction, nous donnons des valeurs à la fonction.
Ces valeurs sont les **arguments** de la fonction.
On remarque que la fonction `losange(a, angle)`, définie ci-dessus, a comme paramètre la longueur et le premier angle. Le deuxième angle du losange est calculé.
%% Cell type:markdown id: tags:
**Exemple 2 : Le polygone**
Essayez de comprendre le programme ci-dessous, puis exécutez le...
%% Cell type:code id: tags:
``` python
fromturtleimport*
defpolygone(d,n):# paramètres (d, n)
foriinrange(n):
forward(d)
left(360/n)
write(360/n)
polygone(100,3)# triangle
polygone(100,4)# carré
polygone(100,5)# pentagon
done()
```
%% Output
%% Cell type:markdown id: tags:
On remarque que la fonction `polygone(d, n)` a comme paramètre la distance d'un côté et le nombre de sommets.
%% Cell type:markdown id: tags:
## Retour à la maison...
Revenons à l'exemple d'une fonction qui dessine une maison.
Complétez le programme afin qu'il dessine une troisième maison de taille 100.
%% Cell type:code id: tags:
``` python
fromturtleimport*
defmaison(d):
dot()
forward (1.41*d)# sol
left(90)
forward(d)# mur droit
left(45)
forward(d)# toit droit
left(90)
forward(d)# toit gauche
left(45)
forward(d)# mur gauche
left(90)
backward(200)
maison(50)# maison de taille 50
forward(100)
maison(70)# maison de taille 70
# à compléter
done()
```
%% Output
%% Cell type:markdown id: tags:
## Positionner la maison
!!! info Rappel
Au départ, la tortue se trouve au centre d'une zone rectangulaire appelée _canevas_.

Ce rectangle a les propriétés suivantes :
- l'origine (0, 0) se trouve au centre,
- l'axe horizontal x, s'étend de -300 à +300 (à droite),
- l'axe vertical y, s'étend de -200 à +200 (en haut).
!!!
La fonction `goto(x, y)` place la tortue à la position `(x, y)`. Cette fonction permet de positionner notre maison à un endroit précis.
Pour désigner cette position, nous utilisons la variable `p` (point, position) qui consiste d'un tuple `(x, y)` de coordonnées.
La fonction `write(p)` écrit la position `p` sur le canevas, à la position actuelle de la tortue. Pour marquer ce point de positionnement, nous ajoutons un point (dot) comme marqueur.
%% Cell type:markdown id: tags:
<h3style="color:teal;background-color:azure;"><iclass="fa fa-pencil"aria-hidden="true"></i> Exercice 3 </h3>Aujoutez deux autres maisons de taille différente.
%% Cell type:code id: tags:
``` python
fromturtleimport*
defmaison(x,y,d):
goto(x,y)# aller à la position p
dot()# ajouter un marquer (dot)
down()
forward (1.41*d)# sol
left(90)
forward(d)# mur droit
left(45)
forward(d)# toit droit
left(90)
forward(d)# toit gauche
left(45)
forward(d)# mur gauche
left(90)
up()
maison(0,0,50)# maison à la position (0, 0)
maison(-150,50,70)# maison à la position (-150, 50)
done()
```
%% Output
%% Cell type:markdown id: tags:
## Colorier la maison
Maintenant nous modifions la fonction pour inclure non seulement la position, la taille, mais également la couleur de la maison comme paramètres. Les arguments de la fonction sont :
-`p` -- position de la maison
-`d` -- dimension de la maison
-`c` -- couleur de la maison
%% Cell type:markdown id: tags:
<h3style="color:teal;background-color:azure;"><iclass="fa fa-pencil"aria-hidden="true"></i> Exercice 4 </h3>Aujoutez deux autres maisons de taille et couleur différente.
Ajoutez deux paramètres: `w` pour l'épaisseur de la ligne (width), et `c2` pour la couleur de ligne.
La fonction aura la forme `coeur(r, w, c, c2)`.
%% Cell type:code id: tags:
``` python
fromturtleimport*
defcoeur(r,c):
down()
fillcolor(c)
begin_fill()
left(90)
circle(r,225)
forward(2.4*r)
left(90)
forward(2.4*r)
circle(r,225)
left(90)
end_fill()
up()
coeur(50,'darkviolet')
forward(130)
coeur(40,'tomato')
done()
```
%% Output
%% Cell type:markdown id: tags:
## Escalier
-`d` -- longueur de marche
-`e` -- hauteur de marche
-`n` -- nombre de marches
%% Cell type:code id: tags:
``` python
fromturtleimport*
defescalier(d,e,n):
dot()# marqueur de début
foriinrange(n):
forward(d)
left(90)
forward(e)
right(90)
escalier(20,10,5)
escalier(10,-20,5)
escalier(30,10,4)
done()
```
%% Cell type:markdown id: tags:
## Valeurs par défaut
Quand une fonction possède beaucoup d'arguments, nous pouvons spécifier des valeurs par défaut. Pour ceci nous ajoutons la valeur par défaut dans la liste de paramètres avec le symbole `=`.
La fonction `rectangle(p, d, e, w=1, pen='black', fill='white')` dessine un rectangle aux dimensions `d` x `e` à la position `p`.
Cette fonction possède 3 paramètres optionnels (valeur par défaut en parenthèse):
-`w` -- épaisseur de ligne (`1`)
-`pen` -- couleur de ligne (`'black'`)
-`fill` -- couleur de remplissage (`'white'`)
Il a maintenant différentes façons à appeler la fonction. Tous les paramètres qui ont une valeur par défaut sont optionnels. Au minimum nous devons spécifier les paramètres sans valeur par défaut.
```
rectangle((40, 0), 80, 40)
```
Le rectangle est dessiné dans la direction actuelle de la tortue. Cette orientation peut être changée avec `seth()`. La tortue se positionne de l'autre côté du point de départ. Ceci permet d'enchainer à dessiner des rectangles.
%% Cell type:code id: tags:
``` python
fromturtleimport*
penup()
defrectangle(p,d,e,w=1,pen='black',fill='white'):
goto(p)
pendown()
width(w)
pencolor(pen)
fillcolor(fill)
begin_fill()
foriinrange(2):
forward(d)
left(90)
forward(e)
left(90)
end_fill()
penup()
rectangle((-200,30),40,30)
rectangle((-100,-20),40,30,1,'orange','orange')
rectangle((100,-40),30,80,fill='yellow')
rectangle((200,100),80,40,1,'red','pink')
done()
```
%% Cell type:markdown id: tags:
## Polygone régulier
La fonction `polygone()` dessine un polygone régulier avec n sommets. Les arguments de la fonction sont :
-`d` -- distance du segment
-`n` -- nombre de segments
%% Cell type:code id: tags:
``` python
fromturtleimport*
defpolygon(d,n,w=1,pen='black',fill='white'):
down()
pencolor(pen)
width(w)
fillcolor(fill)
begin_fill()
foriinrange(n):
forward(d)
left(360/n)
end_fill()
up()
up()
backward(280)
forninrange(3,9):
polygon(40,n,fill='lime')
color('black')
write(n)
forward(100)
done()
```
%% Cell type:markdown id: tags:
## Polygone étoilé
En ajoutant un paramètre supplémentaire `m`, la fonction `polygone()` permet également de dessiner un polygone étoilé. Ce paramètre signifie le nombre de pics sauté pour aller au prochain des `n` points répartis dans un cercle. Pour `m=1` un polygone régulier est dessiné.
es arguments de la fonction sont :
-`d` -- distance du segment
-`n` -- nombre de segments
-`m` -- paramètre pour polygone étoilé (nombre de pics sautés)
%% Cell type:code id: tags:
``` python
fromturtleimport*
defpolygon(d,n,m=1,w=1,pen='black',fill='white'):
down()
pencolor(pen)
width(w)
fillcolor(fill)
begin_fill()
foriinrange(n):
forward(d)
left(m*360/n)
end_fill()
up()
up()
speed(0)
backward(250)
forminrange(2,6):
polygon(80,11,m,fill='yellow')
color('black')
write(m)
forward(140)
done()
```
%% Cell type:markdown id: tags:
## Nommer une variable
Pour nommer une variable, vous pouvez utiliser :
- lettres (`a...z` et `A...Z`),
- chiffres (`0...9`),
- le tiret bas (`_`).
Le nom de variable :
- est sensible aux majuscules/minuscules,
- ne peut pas commencer avec un chiffre,
- ne doit pas consister d'un mot-clé (`if`, `else`, `for`),
Par exemplee, les noms de variables suivantes sont valides :
`a2`, `_a`, `speed`, `pos_x`, `POS_X`,
tandis que ceux là ne le sont pas : `2a`, `def`, `pos x`.