Vidéo 36 : Comment construire une fonction ?¶
Des instructions à la construction d’une fonction¶
Soit à écrire le code d’une fonction qui calcule le plus grand de deux nombres \(a\) et \(b\) donnés.
On va exposer le processus de transformation permettant de passer d’un code qui répond au problème mais qui n’utilise pas de fonction à un code équivalent mais placé dans une fonction.
On commence par écrire un code n’utilisant pas de fonction mais qui réponde à la question, quel que soit le choix pour ``a`` et ``b`` :
1 2 3 4 5 6 7 | a = 81
b = 31
if a >= b:
print(a)
else:
print(b)
|
8 | 81
|
Il est ESSENTIEL d’utiliser des variables car ce sont elles qui vont devenir les paramètres de la fonction à construire.
On remarque que, en l’état :
- le code ne peut être exécuté que pour deux choix particuliers de
aet deb, cf. lignes 1-2 ; - le code ne place pas le maximum dans un variable mais se contente de l’afficher.
Il est essentiel que le code calcule correctement le maximum quelles que soient les valeurs choisies pour a et b. Par exemple, si dans le code ci-dessus, on change 81 en 2020 et 31 en 3000, le code doit encore afficher la bonne valeur (ici 3000).
Pour faciliter la conversion du code vers celui d’une fonction qui renvoie le maximum entre a et b, on peut placer le maximum dans une variable, par exemple m :
maximum_sans_fonction.py
1 2 3 4 5 6 7 8 9 | a = 81
b = 31
if a >= b:
m = a
else:
m = b
print(m)
|
10 | 81
|
On va maintenant « convertir » ce code en celui d’une fonction. La fonction admet pour paramètres a et b et elle doit renvoyer le maximum m, donc le schéma de la fonction, que l’on va appeler f, est le suivant :
1 2 3 4 | def f(a, b):
# code inconnu ...
# ...
return m
|
Le code inconnu est obtenu en observant le code maximum_sans_fonction.py calculant le maximum m. Voici les deux codes comparés :
maximum_sans_fonction.py
1 2 3 4 5 6 7 8 9 | a = 81
b = 31
if a >= b:
m = a
else:
m = b
print(m)
|
maximum_fonction.py
9 10 11 12 13 14 15 16 17 18 | def f(a, b):
if a >= b:
m = a
else:
m = b
return m
a = 81
b = 31
print(f(a, b))
|
- Lignes 1-2 : ces deux instructions ne servent pas dans le corps de
f. Ces instructions qui définissaientaetbsont remplacées par l’en-tête defligne 10. - Lignes 4-7 : ces lignes sont préservées à l’identique dans le code de
f. - Ligne 9 : comme
fdoit renvoyer le maximumm, on a remplacé l’affichage par une instructionreturn(ligne 15). - Lignes 17-19 : on teste
fde la même façon que le code initial avait été exécuté pour deux valeurs deaetb, cf. lignes 1-2.
Implémenter la fonction signe¶
Écrire une fonction \(\mathtt{signe}\) qui évalue le signe d’un paramètre x :
\(\mathtt{signe(x)}=\begin{cases} \mathtt{1}& \text{si } \mathtt{x>0}\\ \mathtt{-1}& \text{si } \mathtt{x<0}\\\mathtt{0}& \text{si } \mathtt{x=0}\end{cases}\)
Solution
Il faut utiliser des instructions if/else :
def signe(x):
if x>0:
return 1
else:
if x<0:
return -1
else:
return 0
print(signe(0), signe(4), signe(-7))
0 1 -1
Il est possible d’alléger un peu le code en se rappelant qu’une instruction return interrompt définitivement l’exécution d’une fonction :
# Alternative
def signe(x):
if x>0:
return 1
if x<0:
return -1
return 0
print(signe(0), signe(4), signe(-7))
0 1 -1
- Ligne 6 : un
elsen’est pas utile car l’instructionreturnau-dessus entraîne que si le code accède à la ligne 6, c’est que forcémentx>0est faux, ce qui correspond à la situation d’unelse. - Ligne 8 : pour la même raison, si l’exécution du code arrive à cette ligne, c’est forcément que
x=0.
Alternative utilisant if/elif/else¶
Si la clause elif est connue, il est préférable d’écrire le code ainsi :
def signe(x):
if x>0:
return 1
elif x<0:
return -1
else:
return 0
print(signe(0), signe(4), signe(-7))