Une fonction peut accepter un nombre quelconque de paramètres : leurs noms n’ont pas beaucoup d’importance (ils servent à nommer localement les valeurs transmises lors de l’appel à la fonction). En revanche l’ordre dans lequel apparaissent ces paramètres dans la définition de la fonction est important.
On peut donner une valeur par défaut à un ou plusieurs arguments d’une fonction. Pour cela, dans la définition de cette fonction, et si on note arg le nom de l’argument et val sa valeur par défaut, on remplacera arg par arg = val.
Si un argument reçoit une valeur par défaut, il peut donc être omis lors de l’appel de la fonction.
Mais pour qu’il n’y ait aucune ambiguïté, les arguments avec valeurs par défaut (dans la définition de la fonction) doivent suivre ceux qui n’en ont pas.
|
1 2 3 4 |
def f(x, y, z, t): # f est une fonction avec quatre arguments, sans valeurs par défaut def g(x, y, z, t=10): # définition de g où, par défaut, t = 10 def h(x, y, z=5, t=10): # définition de h où, par défaut, z = 5 et t = 10 def k(x, y=2, z, t=10): # cette définition serait illégale |
Dans les exemples précédents :
- pour appeler la fonction f , il faut écrire explicitement f (x, y, z, t) en précisant les valeurs des quatre arguments.
- évaluer g(x, y, z) équivaut à évaluer g(x, y, z, 10) ; on peut bien sûr écrire g(x, y, z, 1000) si on tient à donner la valeur 1000 au quatrième argument t.
- évaluer h(x, y) équivaut à évaluer h(x, y, 5, 10) ; évaluer h(x, y, 999) équivaut à évaluer h(x, y, 999, 10) ; on peut bien sûr écrire h(x, y, 9, 6) si on tient à donner la valeur 9 à l’argument z et la valeur 6 à l’argument t.
- la définition de la fonction k est illégale ; par exemple, dans k(1, 3, 5), comment distinguer (x = 1, y = 3, z = 5, t = 10) de (x = 1, y = 2, z = 3, t = 5) ?
Les arguments avec valeurs par défaut offrent une possibilité intéressante lors de l’appel de la fonction.
On peut en effet remplacer f (· · · , valeur, · · · ) par f (· · · , arg = valeur, · · · ). Il faut bien sûr que le(s) nom(s) arg utilisés ici dans l’appel de f correspondent au(x) nom(s) arg utilisés dans la définition de cette fonction.
Il faut également que les arguments ainsi nommés suivent les arguments non nommés lors de l’appel (ces derniers sont alors simplement appelés arguments positionnels). Enfin, et c’est là le principal intérêt, les arguments nommés peuvent être donnés dans n’importe quel ordre.
Pour comprendre comment ça fonctionne, prenons un exemple très simple. La fonction f prend cinq arguments : les deux premiers sont obligatoires et les trois suivants sont optionnels (ils reçoivent une valeur par défaut dans la définition de f ).
Notre fonction f se résume à afficher les valeurs qu’elle reçoit pour les cinq variables locales x, y, z, t, u.
Voici la définition de f :
|
1 2 |
>>> def f(x, y, z=666, t=777, u=888): print('x=',x,' y=',y,' z=',z,' t=',t,' u=',u,sep='') |
Ensuite, on effectue plusieurs appels à la fonction f , en omettant tout ou partie des arguments par défaut.
|
1 2 3 4 5 6 7 8 |
>>> f(1, 2) # ici z, t, u reçoivent leur valeur par défaut x=1 y=2 z=666 t=777 u=888 >>> f(1, 2, 3) # ici t et u reçoivent leur valeur par défaut x=1 y=2 z=3 t=777 u=888 >>> f(1, 2, 3, 4) # ici seul u reçoit sa valeur par défaut x=1 y=2 z=3 t=4 u=888 >>> f(1, 2, 3, 4, 5) # ici les cinq arguments de f reçoivent une valeur x=1 y=2 z=3 t=4 u=5 |
Dans cette deuxième série d’exemples, on voit qu’il est possible de préciser des valeurs pour un ou plusieurs des arguments optionnels, et ce dans un ordre quelconque, à condition de préciser d’abord les valeurs des deux arguments positionnels (c’est-à-dire non nommés) x et y.
|
1 2 3 4 5 6 |
>>> f(1, 2, u=5) # ici on précise u = 5, mais z et t gardent leur valeur par défaut x=1 y=2 z=666 t=777 u=5 >>> f(1, 2, t=4, u=3) # ici on précise u = 3 et t = 4, mais par défaut z = 666 x=1 y=2 z=666 t=4 u=3 >>> f(1, 2, u=5, t=4, z=3) # ici on précise z = 3, u = 5 et t = 4, dans un ordre quelconque x=1 y=2 z=3 t=4 u=5 |