Fonctions à plusieurs paramètres — approfondissement

Denis Dréano
PROG2-07

Fonctions à plusieurs paramètres — approfondissement

Objectifs cantonaux : O1.6. Semaine dédoublée (×2, groupes A/B séparés).

Cours complet sur la plateforme Runestone de Cédric Donner : Passer des paramètres — approfondissement.

Vous savez déjà définir et appeler des fonctions à un ou plusieurs paramètres (S8). Cette séance approfondit ce qui se passe en mémoire lors de ces appels, puis enchaîne sur de la pratique.

Ce qui se passe en mémoire lors d’un appel

▷ Rappel — Tableau de paramètres

Lors de chaque appel d’une fonction, Python crée un tableau de paramètres qui stocke le nom et la valeur de chaque paramètre. Ce tableau est détruit dès que l’exécution de la fonction se termine.

→ Exemple — trois fonctions, trois tableaux distincts
def f(x):
    print("x dans f() vaut", x)

def g(x):
    print("x dans g() vaut", x)
    f(2 * x)

def h(x):
    print("x dans h() vaut", x)
    g(x)

h(4)

Les trois fonctions ont chacune un paramètre nommé x, mais il s’agit de trois emplacements mémoire différents, qui n’entrent jamais en conflit :

  1. h(4) crée un tableau pour h, avec x = 4.
  2. h appelle g(x), c’est-à-dire g(4) — un nouveau tableau est créé pour g, avec son propre x = 4.
  3. g appelle f(2 * x), c’est-à-dire f(8) — un troisième tableau est créé pour f, avec x = 8.

Résultat affiché :

x dans h() vaut 4
x dans g() vaut 4
x dans f() vaut 8

Pratique — retrouver ce que dessine un programme

→ Exercice — dessiner sur papier avant d’exécuter

Avant de lancer ce programme sur l’ordinateur, dessinez sur papier ce qu’il va produire, en suivant chaque appel de fonction et chaque tableau de paramètres qu’il crée.

from gturtle import *

def carre(cote, couleur):
    setPenColor(couleur)
    for _ in range(4):
        forward(cote)
        right(90)

def fenetre(cote, couleur):
    for _ in range(4):
        carre(cote, couleur)
        right(90)

def mystere(cote, couleur1, couleur2):
    fenetre(2 * cote, couleur1)
    forward(cote)
    left(90)
    forward(cote)
    fenetre(cote, couleur2)
    back(cote)
    right(90)
    back(2 * cote)
    right(90)
    forward(cote)
    fenetre(cote, couleur2)

mystere(100, "blue", "red")

Vérifiez ensuite votre dessin en exécutant réellement le programme.

Pratique — un escalier double

→ Exercice — double_escalier(nombre_marches)

Définissez une fonction double_escalier(nombre_marches) qui dessine un escalier montant, puis redescendant, du même nombre de marches. Au total, le double escalier doit mesurer 500 pixels de large et 200 pixels de haut. Indication : utilisez penUp() / penDown() pour positionner la tortue sans dessiner avant de commencer.