Fonctions
Dans un programme, de nombreuses phases sont répétées à divers endroits du code (sommer ou multiplier des vecteurs 3D dans un moteur physique par exemple). Pour éviter de devoir replacer toutes ces instructions à chaque fois on définis des sous-programmes réutilisables à volonté, appelés fonctions.
Définition
Une fonction est un programme. Elle a ainsi :
- un nom
- des paramètres d'entrée
- une sortie
- des instructions, appelées corps de la fonction
Une fois définie, on peut l'appeler comme une instruction (sa sortie est affectée à la variable sortie
dans l'exemple ci-après) :
sortie ← nom_fonction(entrée_1, ..., entrée_n)
Fonctions et algorithmes
Appels de fonctions
On peut définir des fonctions puis les utiliser ensuite comme dans tout langage de programmation. Considérons l'algorithme de recherche :
algorithme recherche(t: [entier],
x: entier
) → booléen:
pour chaque e de t:
si e == x:
rendre Vrai
rendre Faux
On peut utiliser le pseudo code de nom recherche dans d'autres pseudo-code comme une fonction. Par exemple :
t ← [1, 2, 6]
trouve ← recherche(t, 6)
affiche à l'écran trouve
Est un pseudo-code valide puisque recherche
est bien défini et utilisé correctement (le type de ses paramètres est correct).
Pseudo-code avec fonctions
On peut aussi directement coder des fonctions dans un pseudo-code. Par exemple :
fonction recherche(t: [entier],
x: entier
) → booléen:
pour chaque e de t:
si e == x:
rendre Vrai
rendre Faux
algorithme exorcisme(t: [entier]
) → chaîne:
si recherche(t, 666):
rendre "Aspergez votre ordinateur d'eau bénite. Vite !"
sinon:
rendre "Tout va bien, le tableau n'est pas possédé. Ouf."
Signature d'une fonction
Lorsque l'on défini un algorithme ou un pseudo-code on explicite le type des objets en entrées et en sortie, comme on l'a fait pour l'algorithme recherche.
Lorsque l'on code une fonction en python on a pas toujours l'habitude (ni le besoin) de le faire, mais on peut le spécifier en utilisant les signatures de fonctions, qui correspond juste à la description de son bloc :
Définition
Une signature de fonction associe :
- son type à chaque paramètre (précédé d'un
:
) - le type de sortie (précédé d'un
→
)
Par exemple, la signature de la fonction recherche est :
recherche(t: [entier], x: entier) → booléen
Type d'une fonction
Une fonction peut très bien être un paramètre d'une autre fonction. Son type est alors sa signature. Par exemple le type de la fonction recherche
précédente sera tout simplement ([entier], entier) → booléen
: on donne le type de ses entrées et de sa sortie.
Variables locales
Il est important de voir que lorsque l'on exécute une fonction, les variables qu'elle crée existeront dans un espace à elle, pas dans celui du pseudo-code appelant. Le code suivant affichera 4 et pas 6 qui est dernière valeur prise par la variable e
de la fonction recherche
:
e ← 4
t ← [1, 2, 6]
trouve ← recherche(t, 6)
affiche à l'écran trouve
Objet fonction
Une fonction peut être associée à un nom comme tout autre objet. Par exemple, en supposant que la fonction recherche
soit définie :
f ← recherche
t ← [1, 2, 6]
trouve ← f(t, 6)
affiche à l'écran trouve
Ne confondez pas nom
qui est l'algorithme et nom(a, b)
qui est le résultat de son exécution avec les paramètres a
et b
.
Récursivité
Le fait que les variables et les noms définies dans les fonctions restent dans le cadre de la fonction actuellement exécuté nous donnent accès à la récursivité : Il suffit que notre pseudo-code s'appelle lui-même comme une fonction.
Attention aux conditions d'arrêts pour garantir qu'une fonction ne s'appelle pas indéfiniment.