Une fonction est un programme qui possède un nom, qui peut prendre en entrée des arguments et qui peut retourner un résultat.
Dans l'exemple suivant nous avons écrit une fonction qui se nomme aire
, ses paramètres sont longueur
et largeur
et elle retourne l'aire du rectangle dont les dimensions sont communiquées.
def aire(longueur,largeur):
return longueur*largeur
La définition d'une fonction débute par le mot clé def
suivi de son nom et entre parenthèses des noms des paramètres séparés par des virgules (les paramètres sont des variables qui reçoivent les arguments passés à la fonction), pour finir, le bloc d'instructions de la fonction est en retrait (suivant les règles indentation rigoureuse).
Pour qu'une fonction s'exécute elle doit être appelée depuis un programme et le code source de la fonction peut être écrit dans le même fichier que le « programme principal ».
Voici un programme avec la fonction de l'exemple précédent :
Le programme principal appelle deux fois la fonction aire
et affiche le résultat retourné.
La première fois, la fonction aire
est appelée avec les arguments 4 et 3, cela signifie que lorsque la fonction va s'exécuter les variables longueur
et largeur
prennent les valeurs 4 et 3.
L'instruction return
de la fonction indique le résultat à retourner.
La seconde fois, la fonction aire
est appelée avec les arguments 5 et 2, cette fois les variables longueur
et largeur
reçoivent respectivement les valeurs 5 et 2.
Ainsi une fois que nous avons programmé la fonction aire
, nous pouvons la réutiliser autant de fois que l'on souhaite, et même la réutiliser dans d'autres programmes.
Dans le programme suivant nous avons programmé une fonction supplémentaire pour l'affichage du résultat de l'aire.
Le calcul de l'aire et l'affichage sont programmés dans deux fonctions distinctes.
LeNone
signifie que la fonction n' a rien renvoyé, pas de return
, pour ne plus afficher None
,il suffit de mettre return ""
.Le gros avantage par rapport à une seule fonction qui engloberait à la fois le calcul de l'aire et de l'affichage est qu'il est possible d'utiliser chacune des fonctions indépendamment l'une de l'autre :
pour calculer l'aire sans l'afficher,
pour afficher un résultat d'aire sans utiliser la fonction aire
.
Ce qui n'empêche pas de cumuler l'usage des deux fonctions comme avec l'instruction : afficheAire(2,3,aire(2,3));
Cette façon de procéder est une bonne pratique de programmation : il faut autant que possible décomposer un projet en tâches bien précises qui sont programmées dans des fonctions distinctes, beaucoup plus faciles à réaliser et à maintenir qu'un long programme. En outre les différentes fonctions peuvent être programmées par des personnes différentes, ce qui est fondamental pour le travail en équipe.
Voici un autre programme, exécutez-le et observez le résultat.
La variable resultat
du programme principal n'a rien à voir avec la variable resultat
de la fonction.
Toutes les variables définies dans le bloc d'instructions d'une fonction (y compris les paramètres) sont locales à la fonction, c'est à dire qu'elles n'existent que lors de l'exécution de la fonction et qu'elles n'interfèrent pas avec les variables qui portent le même nom dans le programme principal ou dans d'autres fonctions.
Pour contre, on peut utiliser la variable resultat
en tant que variable global, c'est à dire que si resultat
change dans la fonction, elle change dans le programme principal. Pour cela il suffit de déclarer resultat
comme variable global (global resultat
) dans la fonction.
Comme dans le code ci-desous :
Lorsqu'une fonction s'appelle elle-même lors de son exécution, on parle de fonction récursive.
Voici un exemple : Soit la suite \((u_n)\) définit par \(u_0=2\) et \(u_{n+1}=2u_n+1\).
La fonction suiteU
reçoit une valeur n
, si n=0
alors elle retourne la valeur 2, sinon elle calcule 2*suiteU(n-1)+1
et donc rappelle la fonction suiteU
pour la valeur n-1
et ainsi de suite, jusqu'à ce que n=0
.