Les fonctions¶
Définir des fonctions aide à alléger les programmes mais aussi permet une plus grande flexibilité afin de changer des paramètres, modèles. On peut définir une fonction en python en utilisant:
[1]:
def myfunc(x,alpha):
return x**alpha
Ici la fonction prend deux inputs, une valeur \(x\) ainsi qu’un paramètre \(\alpha\). Elle retourne, \(f(x) = x^{\alpha}\).
[2]:
myfunc(2.0,0.5)
[2]:
1.4142135623730951
On peut définir une valeur par défault pour certains paramètres. Mais tous les paramètres obligatoires doivent apparaître avant ceux qui sont optionnels et qui ont une valeur par défault. Par exemple:
[3]:
def myfunc(x,alpha=0.5):
return x**alpha
[4]:
myfunc(2.0)
[4]:
1.4142135623730951
Variables globales et locales¶
Les variables définies à l’intérieur d’une fonction sont locales à cette fonction. Elles ne sont pas accessibles en dehors de la fonction. Par exemple,
[5]:
def myfunc(x,alpha=0.5):
beta = 4.0
return x**alpha
[6]:
myfunc(2.0)
[6]:
1.4142135623730951
[7]:
beta
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-7-6c007a14875d> in <module>
----> 1 beta
NameError: name 'beta' is not defined
Que se passe-t-il quand une variable est à la fois assigné localement dans la fonction et existe en globale?
[8]:
def myfunc(x,alpha=0.5):
beta = 4.0
return x**alpha
[9]:
beta = 2.0
myfunc(2.0)
beta
[9]:
2.0
Sa valeur ne change pas globalement après un changement local dans la fonction. On peut utiliser une variable globale dans une fonction,
[13]:
def myfunc(x,alpha=0.5):
return x**alpha + beta
[14]:
myfunc(2.0)
[14]:
3.414213562373095
Mais ce n’est pas recommandé afin d’éviter les conflits et faciliter les appels répétés dans lesquels la valeur de beta
change. Mieux vaut faire
[15]:
def myfunc(x,beta=0.0,alpha=0.5):
return x**alpha + beta
[16]:
myfunc(2.0)
[16]:
1.4142135623730951
[17]:
myfunc(2.0,beta=2.0)
[17]:
3.414213562373095
Fonction partielle¶
Certaines fonctions en Python demande comme argument une fonction d’une seule variable. Que faire si notre fonction en a plusieurs. On utilise alors la fonction partial()
de functools
:
[18]:
def myfunc(x,y,alpha,beta):
return x**alpha * y**beta
[19]:
from functools import partial
[20]:
pfunc = partial(myfunc,y=1.0,alpha=0.5,beta=1.0)
[21]:
pfunc(2.0)
[21]:
1.4142135623730951
[22]:
myfunc(2.0,1.0,0.5,1.0)
[22]:
1.4142135623730951
Fonctions à plusieurs résultats¶
Que faire si notre fonction retourne plusieurs réponses? On peut retourner ce qu’on appelle un tuple. Voyons voir,
[24]:
def myfunc(x,y,alpha,beta):
return x**alpha,y**beta
Cette fonction retourne deux nombres.
[28]:
myfunc(2.0,0.0,0.5,1.0)
[28]:
(1.4142135623730951, 0.0)
On peut les assigner avec
[27]:
xx,yy = myfunc(2.0,0.0,0.5,1.0)
xx
[27]:
1.4142135623730951
Les fonctions lambda
¶
On peut écrire des fonctions directement sur une ligne. Ceci est utile dans certaines circonstances:
[1]:
f = lambda x: x**0.5
f(2.0)
[1]:
1.4142135623730951