Les fonctions

Définition

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 :


 

Comment cela fonctionne-t-il ?

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.

Plusieurs fonctions pour un même programme

Dans le programme suivant nous avons programmé une fonction supplémentaire pour l'affichage du résultat de l'aire.


 

Explications

Le calcul de l'aire et l'affichage sont programmés dans deux fonctions distinctes.

Le None 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 :

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.

Portée des variables

Voici un autre programme, exécutez-le et observez le résultat.


 

Que s'est-il passé ?

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 :


 

Fonctions récursives

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\).


 

Que s'est-il passé ?

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.