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.