Dérouler un appel de fonction

Rappel

Méthode de base (fil, ardoise, sortie) : cf. feuille Révisions python - à la main.

Nouveauté : une ardoise par appel.

Les règles en plus

Exemple

1  def double(n):
2      n = n * 2
3      return n
4
5  a = 5
6  b = double(a)
7  print(a, b)

Le fil

Étape Ligne Ce qui se passe
1 1 double existe (corps non exécuté)
2 5 création de a
3 6 appel double(5) → nouvelle ardoise
4 2 n change
5 3 returnretour = 10, ardoise double()
6 6 retour à la ligne d’appel : b = 10
7 7 affichage

Les ardoises

Programme principal

Nom Valeur
double (fonction)
a 5
b 10

double() — vivante des étapes 3 à 5, barrée ensuite

Nom Valeur
n 5 10
retour None 10

La sortie

5 10

a ne change pas : n a reçu une copie de la valeur.

À retenir

Vérifier ensuite avec PyMemViz (mode ardoise) ou pythontutor.

Les corrections

Chaque exercice a un lien PyMemViz (mode ardoise). À ouvrir après avoir déroulé sur papier :

Exercices : appel et retour

Exercice 1

def calcul(a, b=4):
    b = b - a
    return b
print(calcul(1, 3))
print(calcul(a=2))

Fil + ardoises + sortie. Combien d’ardoises calcul() créées en tout ?

Correction : dérouler dans PyMemViz

Exercice 2

def ajoute(x, y):
    print(x, y)
    x += y
    return x
x, y = 5, 2
print(ajoute(x, y), x, y)

Ardoises + sortie. Pourquoi le x du programme principal ne change pas ?

Correction : dérouler dans PyMemViz

Exercice 3

def f1(n):
    print(n * 2)
def f2(n):
    return n * 2
a = f1(3)
b = f2(3)
print(a, b)

Sortie ? Pourquoi a ne vaut-il pas 6 ?

Correction : dérouler dans PyMemViz

Exercices : arguments

Exercice 4

def tarif(base, remise=0, majoration=1):
    return (base - remise) * majoration
print(tarif(100))
print(tarif(100, 20))
print(tarif(100, majoration=2))
print(tarif(majoration=3, base=10))
print(tarif(100, 20, 2))

Sortie ? Puis : pourquoi tarif(remise=5, 100) est-il une erreur ?

Correction : dérouler dans PyMemViz

Exercice 5

Écrire une fonction distance(x1, y1, x2=0, y2=0) qui renvoie la distance entre deux points ((x2x1)2+(y2y1)2\sqrt{(x_2-x_1)^2 + (y_2-y_1)^2}).

Rappel : from math import sqrt puis sqrt(n), ou import math puis math.sqrt(n).

Donner ensuite le résultat de :

Correction : dérouler dans PyMemViz

Exercices : portée des variables

Exercice 6

n = 1
m = 2
def essai(m, p):
    n = 10
    print(n, m, p)
print(n, m)
essai(m=7, p=8)
print(n, m)

Deux ardoises + sortie. Quelles variables disparaissent à la fin de essai ?

Correction : dérouler dans PyMemViz

Exercice 7

seuil = 10
def verifie(x):
    return x > seuil
print(verifie(12))
print(verifie(3))

Sortie ? D’où vient seuil dans l’ardoise de verifie() ?

Correction : dérouler dans PyMemViz

Exercice 8

compteur = 0
def incremente():
    compteur = compteur + 1
    return compteur
print(incremente())

Ce programme plante. Pourquoi ? Le corriger sans utiliser global.

Voir le plantage dans PyMemViz

Correction : dérouler dans PyMemViz

Exercices : appels imbriqués

Exercice 9

def g(a):
    return a + 3
def f(b):
    return b * 2
print(f(g(f(1))))

Ordre des appels ? Sortie ? Combien d’ardoises vivantes en même temps, au maximum ?

Correction : dérouler dans PyMemViz

Exercice 10

def a(n):
    print("a", n)
    return n + 1
def b(n):
    print("b", n)
    return a(n) * 2
def c(n):
    print("c", n)
    return b(n) + a(n)
print(c(1))

Fil complet + sortie. Combien de fois a() est-elle appelée ?

Correction : dérouler dans PyMemViz

Exercices : fonctions et listes

Exercice 11

def ajoute_zero(t):
    t.append(0)
    return t
def remplace(t):
    t = [0, 0, 0]
    return t
liste = [1, 2]
ajoute_zero(liste)
print(liste)
remplace(liste)
print(liste)

Sortie ? Expliquer la différence entre t.append(0) et t = [0, 0, 0].

Correction : dérouler dans PyMemViz

Exercice 12

def moyenne(notes):
    total = 0
    for n in notes:
        total += n
    return total / len(notes)
mes_notes = [12, 8, 16]
print(moyenne(mes_notes))
print(moyenne([20]))
print(mes_notes)

Ardoise de moyenne() pour le premier appel (total change à chaque tour) + sortie. Combien d’ardoises moyenne() en tout ?

Correction : dérouler dans PyMemViz

Exercices : une fonction est un objet

Exercice 13

def bip():
    print("bip")
def bop():
    print("bop")
son = bip
son()
def triple(f):
    f()
    f()
    f()
triple(bop)
triple(f=son)
print(type(bip))

Sortie ? Que contient exactement son ?

Correction : dérouler dans PyMemViz

Exercices : à écrire

Exercice 14

Écrire hypotenuse(a, b) qui renvoie la longueur de l’hypoténuse d’un triangle rectangle de côtés a et b.

Rappels :

Vérifier à la main avec hypotenuse(6, 8).

Correction : dérouler dans PyMemViz

Exercice 15

Écrire dans_intervalle(x, mini=0, maxi=20) qui renvoie True ou False selon que x est dans [mini, maxi].

Donner le résultat de dans_intervalle(25), dans_intervalle(25, 0, 100) et dans_intervalle(5, maxi=3).

Correction : dérouler dans PyMemViz

Exercice 16

Écrire maximum(t) qui renvoie le plus grand élément de la liste t, sans utiliser max. La fonction renvoie None si la liste est vide.

Dérouler l’ardoise pour maximum([3, 9, 2]).

Correction : dérouler dans PyMemViz