Non, non, rassurez-vous, pas de maths ici ( quoique...), la notion de fonction en informatique est assez différente de celle utilisée en mathématiques.
Vous avez en fait déjà utilisé des fonctions ( print()
, input()
,...), mais à quoi exactement correspond cette notion ?
Certaines parties de programme peuvent ( ou doivent ) être parfois utilisées plusieurs fois; il est donc nécessaire de pouvoir les « appeler » sans pour autant ré-écrire à chaque fois l'ensemble du code. Ces parties de programmes peuvent être regroupées dans des fonctions qui faciliteront la lecture et la compréhension du programme principal.
Voici un exemple qui illustre la nécessité et l'intérêt de ce concept.
Supposons que vous deviez écrire un script qui calcule le volume d'un parallélépipède pour différentes valeurs de ses côtés. On pourrait écrire par exemple quelque chose comme :
# cas n°1
longueur = 5
largeur = 10
hauteur = 8
volume = longueur * largeur * hauteur
print(volume)
# cas n°2
longueur = 15
largeur = 12
hauteur = 10
volume = longueur * largeur * hauteur
print(volume)
# cas n°3
longueur = 10
largeur = 10
hauteur = 20
volume = longueur * largeur * hauteur
print(volume)
On constate tout de suite que l'on a écrit à peu près 3 fois la même chose, en ne modifiant à chaque fois que la valeur des variables...
Il serait donc judicieux de coder une seule fois les instructions communes aux différentes parties du script ci-dessus, tout en permettant à ces instructions de "s'adapter" à des valeurs de variables différentes : c'est le rôle d'une fonction, qui va "regrouper" en un même endroit du code la ou les instruction(s) qui réalisent le traitement :
fonction permettant de calculer le volume :
volume = longueur x largeur x hauteur
renvoyer le résultat
# cas n°1
utiliser la fonction avec les valeurs 5, 10 et 8
imprimer le résultat
# cas n°2
utiliser la fonction avec les valeurs 15, 12 et 10
imprimer le résultat
# cas n°3
utiliser la fonction avec les valeurs 10, 10 et 20
imprimer le résultat
Le script est ainsi beaucoup plus concis et lisible, sa maintenance et son débogage en seront très facilités !!
Une fonction est donc une sorte de "programme dans le programme".
Comme dans tout langage, une fonction en Python suit des règles d'écriture et d'utilisation précises.
La définition d'une fonction correspond à l'écriture des instructions qui effectueront la tache pour laquelle elle est conçue.
Dans le cas d'un langage compilé ( comme C, Java, C++,...), la définition des fonctions peut se faire n'importe où dans le code, en dehors du corps principal du programme.
Dans le cas des langages de script comme Python, la définition des fonctions doit se faire avant leur utilisation dans le code, donc généralement en tout début de script, après les éventuelles instructions
d'importation de module(s).
def nom_de_la_fonction(paramètres):
.....................
Instruction(s)
.....................
return résultat
def
def
.return
suivi du résultat du traitement ( une valeur particulière ou le contenu d'une variable ) permet de renvoyer le résultat du travail de la fonction
au programme principal.return
n'est pas utile ).Pour l'exemple d'introduction, on pourrait ainsi définir une fonction calcul_volume()
de la façon suivante :
def calcul_volume(longueur, largeur, hauteur): # la fonction a besoin de 3 paramètres pour faire le calcul du volume
volume = longueur * largeur * hauteur
return volume
On notera bien que, pour l'instant, la valeur des variables longueur, largeur et hauteur n'est pas encore définie ( elles n'ont même pas été initialisées ! ).
On leur donnera en fait des valeurs par la suite, lorsqu'on appellera ( c'est à dire, exécutera ) vraiment la fonction.
Pour l'instant, ces variables sont donc l'équivalent du "x" dans une équation mathématique, c'est à dire quelque chose qui peut prendre a priori n'importe quelle valeur.
On ne mettra donc surtout pas de input()
ou de largeur = 3
dans une fonction pour coder "en dur" la valeur des paramètres, ce n'est pas comme ça que cela fonctionne !!
float
:
def volume_sphere(r):
pi = 3.1415
volume = (4/3)*pi*r**3
return volume
def message_de_bienvenue( nom ):
return 'Bonjour' + nom + 'et bienvenue dans ce programme.'
On voit dans cet exemple que l'on peut directement renvoyer le résultat d'une expression ( ici, une concaténation de chaînes ), sans passer par une variable intermédiaire ( et oui, une expression est elle-même évaluée à un certain résultat...)
def division( n1, n2 ):
quotient = n1 // n2
reste = n1 % n2
return quotient, reste # les résultats multiples sont séparés par une virgule
Pour "utiliser" ensuite une fonction une fois celle-ci définie, il faut l'appeler afin qu'elle s’exécute : si on définit une fonction sans l'appeler, rien ne se passera !
L'appel d'une fonction correspond au moment où on l’exécute; cet appel prend la forme d'une instruction généralement placée dans le corps principal du programme. ( mais pas obligatoirement : une fonction peut appeler une autre fonction ! )
Lors de l'appel d'une fonction, il se passe en réalité plusieurs choses au même endroit du script :
( Tout se passe donc comme si l'instruction d'appel avait été remplacée dans le code par les instructions de la fonction. )
L'appel d'une fonction se fait simplement en indiquant son nom, avec entre parenthèses, la liste du ( ou des ) arguments(s) à lui passer, dans le même ordre que celui des paramètres
dans sa définition.( si la fonction n'a aucun paramètre, on ne lui passe aucun argument ! ).
Les arguments peuvent être des valeurs, des noms de variables, des expressions, etc...
nom_de_la_fonction(arg1, arg2,...)
Mais attention, le fait qu'une fonction renvoie un résultat ne veut pas dire que le programme principal peut directement l'utiliser; lors de l'appel d'une fonction, il faut donc en plus "faire quelque chose" du résultat renvoyé par la fonction, comme l'afficher ou l'affecter à une variable ( sinon ce résultat est "perdu" ! ) :
print(nom_de_la_fonction(arg1, arg2,...)) # affichage de la valeur renvoyée par la fonction
result = nom_de_la_fonction(arg1, arg2,...) # la variable result contiendra la valeur renvoyée par la fonction
Le fait qu'une fonction renvoie un résultat ne veut pas dire que celui-ci va s'afficher ou qu'il sera gardé en mémoire : il faut "faire quelque chose" de ce résultat...
La majorité des fonction renvoient un résultat, c'est par exemple le cas de la fonction input
, dont il faut affecter le résultat à une variable, sinon ce que
l'utilisateur avait rentré est perdu !
D'autres fonctions ne renvoient aucun résultat, c'est le cas de la fonction print
.
Mais en Python, c'est un peu particulier : une fonction qui ne renvoie aucun "vrai" résultat renvoie None
, un mot-clé signifiant "rien".
# Définition des fonctions
def message_de_bienvenue( nom ):
return 'Bonjour' + nom + 'et bienvenue dans ce programme.'
def volume_sphere(r):
pi = 3.1415
volume = (4/3)*pi*r**3
return volume
def division( n1, n2 ):
quotient = n1 // n2
reste = n1 % n2
return quotient, reste
def calcul_volume(longueur, largeur, hauteur): # la fonction a besoin de 3 paramètres pour faire le calcul du volume
volume = longueur * largeur * hauteur
return volume
# Programme principal
nom = input('Quel est votre nom ?')
print(message_de_bienvenue( nom ))
volume = volume_sphere(5) # calcul du volume d'une sphère de rayon r = 5
print( volume )
volume = calcul_volume(10, 5, 2)
print( volume )
quotient, reste = division(125, 23) # il faut passer 2 arguments, et récupérer 2 résultats !!
print('Quotient =', quotient)
print('Reste =', reste )
On peut remarquer qu'il n'y a pas d'ordre particulier pour la définition des fonctions, du moment que cette définition se fait avant l'appel de la fonction.
cube()
qui retourne le cube de la valeur passée en paramètre.somme()
qui prend en paramètres 3 nombres ( entiers ou pas ) et qui renvoie leur somme.calculs()
qui :
convertir_temperature()
qui prend comme paramètre une température en °C, et qui renvoie la valeur de cette température convertie en Fahrenheit.miroir()
qui prend comme paramètre une chaîne de caractères, et qui renvoie la chaîne avec ses caractères en sens inverse.