Les fonctions - premier contact

Les fonctions sont des éléments fondamentaux en programmation. Elles permettent de structurer le code, de le rendre plus lisible et plus simple à maintenir ou à faire évoluer. Nous en avons déjà manipuler plusieurs : print, input, int, float et str. Nous introduisons dans ce chapitre les éléments principaux et nous reviendrons dessus ultérieurement.

Déclaration et appel d’une fonction

Voici la définition d’une fonction simple (lignes 1 et 2) qui calcule le carré d’un nombre, suivit de son utilisation (ligne 4).




(fonction1)

Le mot-clef def indique nous allons définir une fonction. Il est suivit de son nom et, entre paranthèse, de paramètres. Les deux points, :, marquent le début du bloc de code de la fonction. Ce sont les instructions qui seront exécutées chaque fois que l’on appelera la fonction. Chaque ligne du bloc doit être indentée c’est-à-dire décalée d’une tabulation vers la droite.

Attention, l’indentation est nécessaire et souvent source d’erreur chez les programmeurs novices. L’omission des deux points est également une erreur fréquente.

Pour appeler une fonction, on utiliser son nom suivit de paranthèse avec les valeurs que l’on souhaite donner aux attributs. Ainsi, ligne 4, square(10) appel la fonction square et lie la variable x de la fonction avec la valeur 10. Le bloc de code de la fonction est alors exécuté. Ici il ne contient qu’une seule instruction return x*x. Celle-ci indique la valeur qui sera substituée à square(10). On obtiendra donc l’affichage de x*x, soit 100 dans notre cas.

Portés des variables

La portés d’une variable correspond la zone du programme dans laquelle celle-ci est accessible et manipulable. Les paramètres d’une fonction f ainsi que toute variable qui serait déclarée dans f ne sont accessibles que dans f.

Ainsi l’exemple suivant génère une erreur NameError car la variable y n’est accessible que dans le bloc de code de la fonction cube.




(fonction-portee)

Nous reviendrons ultérieurement sur la notion de porté ainsi que l’espace de nom.

Paramètres des fonctions et appel

La fonction que nous avons vu précédement, square, prend en paramètre une valeur. Il est possible de définir des fonctions prenant plus de paramètres ou aucun. Dans tous les cas, lors de l’appel d’une fonction, il est nécessaire de spécifier entre paranthèses le nombre exact des paramètres.




(fonction-parametres)

Attention, à la ligne 6 de l’exemple précédent, les paranthèses sont indispensables pour l’appel de la fonction. Leur omission ne produit pas d’erreur mais au lieu d’exécuter la fonction read_int, on la manipule comme une valeur. C’est possible en Python car les fonctions sont des valeurs au même titre que les entiers ou les chaines de caractères.

Dans l’exemple suivant, la fonction read_int n’est pas exécuté et sa valeur de retour n’est pas affiché, à la place c’est ce qui est affiché est sa référence en mémoire.




(fonction-parametres3)

Fonctions avec et sans résultat

Nous avons déjà vu le mot clef return. Ce dernier permet d’indiquer ce que vaut une fonction à la fin de son exécution. La valeur qui suit return est substituée à l’appel de cette fonction. Elle peut donc être utiliser dans un calcul comme on le voit à la ligne 5 de l’exemple suivant.

Le mot clef return est la dernière instruction exécutée dans une fonction. Une fois la valeur de retour calculé, Python quitte la fonction. L’instruction de la ligne 3 n’est donc jamais exécutée.




(fonction-sans-resultat)

Python permet de définir des fonctions sans utiliser le mot clef return. Ces fonctions auront tout de même une valeur de retour par défaut : None.

Nous en avons déjà rencontré de telles fonctions, par exemple la fonction print. Cette dernière affiche une valeur à l’écran mais n’a pas de valeur. Elle ne peut pas être utilisé pas un calcul.




(python-sans-resultat2)

Quelques clarifications

Voici des éléments supplémentaires et des clarifications sur le comportement des fonctions.

Next Section - Structures de contrôle conditionnelles - le branchement