Une fonction est un bloc d’instructions qui a reçu un nom, dont le fonctionnement dépend d’un certain nombre de paramètres (les arguments de la fonction) et qui renvoie un résultat (au moyen de l’instruction return).
|
1 2 |
def nom_de_la_fonction (arguments ): # le nom de la fonction, et les paramètres d'appel bloc_d'instructions # on parcourt ce bloc |
Python propose le type NoneType, dont la seule valeur est None : c’est une représentation du “rien”, de l’absence.
La séquence des arguments d’une fonction peut très bien être vide. Si f est une telle fonction, l’instruction y = f () appelle la fonction (provoque son exécution) et place le résultat dans la variable y. On notera que les parenthèses sont indispensables, pour distinguer l’objet f qui est une fonction de l’objet f () qui est le résultat d’un appel à cette fonction.
Dans un tel cas, il est préférable de penser que f prend tout de même un argument, à savoir la valeur None.
La valeur de retour d’une fonction est obtenue par une instruction return valeur dans le corps de la fonction.
Il peut y avoir plusieurs instructions return dans une fonction (évidemment on ne sortira réellement de la fonction qu’en passant par l’une et l’une seulement de ces instructions).
L’oubli de return est une erreur classique. Dans ce cas, la fonction renvoie la valeur None (c’est peut-être le but).
Un affichage obtenu par print dans le corps d’une fonction ne doit pas être considéré comme le résultat de la fonction (c’est un simple effet de bord ). D’ailleurs la fonction print renvoie la valeur None.
L’exemple suivant, extrêmement simple, illustre la nécessité de l’instruction return :
|
1 2 3 4 5 6 7 8 9 |
>>> def f(x): print(x*x) # la fonction f , d'argument x, affiche le carré de x >>> y = f(5) # on appelle f avec l'argument 5 et on met le 'résultat' dans y 25 # bien sûr, cet appel provoque l'affichage de la valeur 25 >>> y # mais ce n'était qu'un 'effet de bord' # en fait y ne contient rien (ou plutôt si, la valeur None) >>> type(y) # on le voit bien en demandant le type de y <class 'NoneType'> >>> print(y) # ou plus clairement en affichant le 'contenu' de y par print None |
On va maintenant modifier la fonction f :
|
1 2 3 4 |
>>> def f(x): x*x # on calcule toujours x2, mais il n'y a pas de print ni de return >>> y = f(5) # on appelle f avec l'argument 5 et on met le 'résultat' dans y >>> type(y) # il ne s'est rien passé à l'écran (pas de print) <class 'NoneType'> # et on voit que la valeur 52 est perdue, car f (5) a renvoyé None |
On opère une nouvelle modification de la fonction f :
|
1 2 3 4 |
>>> def f(x): return x*x # on calcule toujours x2, on ne l'affiche pas, mais on le renvoie >>> y = f(5) # on appelle f avec l'argument 5 et on met le résultat dans y >>> y # effectivement, y contient maintenant la valeur 25 25 |
Remarque : un return vide (c’est-à-dire suivi d’aucune expression) renvoie la valeur None.