Les fonctions

Lorsqu’un programme atteint une taille critique (de l’ordre de quelques dizaines de lignes maximum), il devient rapidement impératif d’organiser au mieux les lignes de code, tout comme on organise ses idées dans des parties séparées et des paragraphes pour une dissertation par exemple.

En informatique, un des moyens pour atteindre cet objectif est d’utiliser la notion de fonction.

Qu’est-ce qu’une fonction ?

Une fonction en python peut rappeler par certains aspects la notion de fonction en mathématique: on peut voir une fonction comme une sorte de boîte noire prenant une ou plusieurs valeurs en entrée, et renvoyant une valeur en sortie.

Le langage python est livré avec des milliers de fonctions déjà écrites, que l’on trouvera dans la librairie standard.

Par exemple, il existe une librairie dédiée au mathématiques, comportant notamment la plupart des fonctions (au sens mathématique) utilisées au lycée. Essayez les commandes suivantes dans le shell python:

>>> from math import sqrt, cos, sin, pi
>>> sqrt(9)
3.0
>>> cos(1.5)
0.0707372016677029
>>> sin(3*pi/4)
0.7071067811865476

Ici, sqrt, cos et sin sont trois fonctions (au sens de python) qui se comportent exactement comme les fonctions équivalentes en mathématiques (sqrt vient de l’anglais square root qui se traduit littéralement en racine carrée).

Mais le langage python dispose aussi de fonctions dont la vocation n’est pas de renvoyer une valeur, mais plutôt de produire un effet: affichage dans la console, émission d’un son, lancement d’une vidéo, accès au réseau, écriture sur un disque, etc\(\dots\).

La fonction print en est un exemple : elle accepte un nombre indéterminé de paramètres, et les affiche dans la console en les séparant par des espaces:

print("La racine carrée de 42 est", sqrt(42), ".")
La racine carrée de 42 est 6.48074069840786 .

Il n’y a pas d'équivalent en mathématique de la fonction print: on constate qu’en python la notion de fonction est bien plus large que celle des mathématiques. On parle parfois de sous-programme pour désigner une fonction dont le but n’est pas le calcul d’une valeur mais la production d’un effet.

Comment définir une fonction en python ?

Commençons par définir une fonction python qui s’appellera f, et dont le comportement sera calculé sur la fonction mathématique \[f: x\longmapsto (x+1)^2\]

def f(x):
    return (x + 1)**2

f(3)

Ce petit script affiche le résultat escompté:

16

Le mot clé def annonce la définition d’une fonction. Il est toujours suivi du nom de cette fonction, puis de la liste des paramètres entre parenthèses.

Le corps de la fonction est une suite plus ou moins longue d’instructions python, qui devront toujours être indentées par rapport à la marge de gauche. C’est par ce mécanisme que le l’interpréteur du langage python saura quelles sont les lignes qui font partie de la fonction, et celles qui n’en font plus partie.

L’instruction spéciale return signifie deux choses: elle interrompt d’une part l’exécution de la fonction (même s’il reste d’autres instructions derrière) et d’autre part elle précise quelle sera la valeur de retour de la fonction.

La dernière ligne n'étant pas indentée, elle ne fait pas partie de la définition de la fonction. Bien au contraire, elle sert à appeler la fonction en associant au paramètre x la valeur 3. Comme on le constate, la valeur de retour est bien le nombre attendu, puisque \((3 + 1)^2 = 4^2 = 16\).

En python, on utilisera plutôt des noms de fonctions (mais aussi de paramètres, de variables) décrivant précisément leur usage, à l’inverse des mathématiques où on privilégie les variables et les fonctions à une lettre.

Voici un exemple beaucoup plus pythonesque:

def périmètre_rectangle(longeur, largeur):
    périmètre = (longeur + largeur) * 2
    return périmètre

périmètre_rectangle(5, 12)
34

Fonction produisant un effet de bord

Voici un exemple d’une fonction qui ne renvoie aucune valeur: son but est simplement d’afficher un ou plusieurs messages dans la console: on dit que la fonction produit un effet de bord:

def salutation(prénom):
    print("Bonjour", prénom, "!")
    print("Comment allez-vous ?")

salutation("Pascal")

Comme on peut le constater, bien que la fonction ne renvoie aucune valeur (a priori), son appel produit un affichage dans la console:

Bonjour Pascal !
Comment allez-vous ?

Une fonction peut très bien appeler une autre fonction: python ne perdra jamais le fil de l’exécution, et saura retrouver à chaque fois la ligne de code à partir de laquelle la fonction a été appelée.

Un programme complet est en général constitué de dizaines (voire de milliers) de fonctions qui s’appellent mutuellement. Nous reparlerons plus tard des aspects pratiques de l’organisation du code d’un programme complet.

Voici un exemple à peine plus complexe:

def appliquer_tva(prix_hors_taxe, taux):
    tva = prix_hors_taxe * taux / 100
    return prix_hors_taxe + tva

def imprime_étiquette(objet, prix_hors_taxe):
    prix_ttc = appliquer_tva(prix_hors_taxe, 19.6)
    print(objet, "- prix TTC: ", prix_ttc, "€")

imprime_étiquette("Lecteur MP3", 45)

Les appels imbriqués aux deux fonctions sont totalement invisibles pour l’utilisateur. Seul le résultat est affiché dans la console:

Lecteur MP3 - prix TTC:  53.82 €