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