cours1 min de lecture

Définitions et appels de fonctions

Donner un nom à un bout de programme pour le réutiliser, avec paramètres et valeur de retour.
programme

Introduction

Une fonction, c'est un peu comme une recette de cuisine. Vous lui fournissez des ingrédients (les paramètres), elle suit sa procédure, et elle vous rend un plat (la valeur de retour). Une fois la recette écrite, vous pouvez la réutiliser autant de fois que vous le souhaitez, avec des ingrédients différents — sans avoir à réécrire les étapes à chaque fois.

Vous avez sans doute remarqué qu'en programmation, on répète vite les mêmes opérations : « calculer le carré d'un nombre », « afficher un menu », « vérifier si une note est suffisante »… À chaque fois, on aimerait emballer ce morceau de programme une fois pour toutes, et lui donner un nom, pour pouvoir l'utiliser ensuite sans tout réécrire.

C'est exactement ce que fait une fonction : un bout de programme nommé, qu'on peut appeler ailleurs aussi souvent qu'on veut.

Vous connaissez déjà des fonctions

Depuis le début du chapitre, vous utilisez des fonctions sans le savoir :

print("Bonjour")
range(10)
  • print est une fonction. On lui donne un texte, elle l'affiche.
  • range est une fonction. On lui donne un nombre, elle produit une suite.

Appeler une fonction consiste à écrire son nom suivi de parenthèses, en glissant éventuellement des valeurs entre les parenthèses. Ces valeurs s'appellent les arguments.

Définir sa propre fonction

Pour créer une fonction, on utilise le mot-clé def (pour define, définir) :

def saluer():
    print("Bonjour")
    print("Comment allez-vous ?")

Décodage :

  • def saluer(): — on définit une fonction nommée saluer. Les parenthèses vides signifient qu'elle ne prend pas de paramètre.
  • Les deux lignes indentées en dessous forment son corps : ce qu'elle fait quand on l'appelle.

Important : écrire def saluer(): ne fait rien — c'est une simple définition. Pour exécuter le bloc, il faut appeler la fonction :

def saluer():
    print("Bonjour")
    print("Comment allez-vous ?")

saluer()
saluer()

Affichage attendu :

Bonjour
Comment allez-vous ?
Bonjour
Comment allez-vous ?
Définir ≠ Appeler. La définition (def …) prépare la fonction. L'appel (saluer()) déclenche son exécution. On peut définir une fonction et ne jamais s'en servir ; le programme tournera quand même, juste sans elle.

Avec une fonction definie comme def hello(): print('Hi'), combien de fois 'Hi' est-il affiché si on n'écrit jamais hello() ?

Les paramètres — personnaliser la fonction

Une fonction devient vraiment utile quand on peut lui donner des informations à chaque appel. Cela se fait via les paramètres :

def saluer(prenom):
    print("Bonjour", prenom)

saluer("Léa")
saluer("Mehdi")
saluer("Camille")

Affichage :

Bonjour Léa
Bonjour Mehdi
Bonjour Camille

À chaque appel :

  • la valeur entre parenthèses ("Léa", "Mehdi", etc.) est l'argument ;
  • elle est rangée dans la variable prenom le temps de l'exécution de la fonction ;
  • la ligne print("Bonjour", prenom) utilise cette valeur.
Paramètre = nom du « réceptacle » dans la définition (prenom ici). Argument = valeur réellement passée à l'appel ("Léa", "Mehdi"). Ces deux mots sont souvent utilisés l'un pour l'autre dans la pratique.

Une fonction peut prendre plusieurs paramètres :

def saluer(prenom, age):
    print("Bonjour", prenom, ", vous avez", age, "ans")

saluer("Léa", 15)
saluer("Mehdi", 16)

L'ordre compte : le premier argument est rangé dans le premier paramètre, et ainsi de suite.

Retourner une valeur — return

Jusqu'ici, nos fonctions ne faisaient qu'afficher. Très souvent, on veut qu'une fonction calcule quelque chose et renvoie le résultat, pour qu'on puisse réutiliser cette valeur :

def carre(n):
    return n * n

Le mot-clé return indique la valeur de retour : celle que la fonction « rend » à l'endroit où elle a été appelée.

def carre(n):
    return n * n

resultat = carre(5)
print(resultat)        # 25
print(carre(7) + 1)    # 49 + 1 = 50

Vous voyez ici toute la puissance de return : la fonction carre(5) est remplacée par la valeur 25 dans l'expression, et on peut réutiliser ce résultat comme n'importe quel autre nombre.

⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.
Une fonction sans return retourne implicitement None (une valeur spéciale qui signifie « rien »). Faire x = saluer("Léa") après notre définition initiale donne x valant None. Bien distinguer : afficher n'est pas retourner.

Que vaut x après : x = carre(3) + carre(4) (où carre(n) = nn) ?

Pourquoi des fonctions ?

Trois bénéfices majeurs :

BénéficeExplication
Éviter la répétitionÉcrire une seule fois, appeler partout.
Lisibilitéaire_disque(r) est plus parlant que 3.14159 * r * r éparpillé.
Localiser les correctionsUne erreur ? On la corrige à un seul endroit, et tous les appels en bénéficient.

Vocabulaire — résumé

  • Définir une fonction : def nom(parametres): …
  • Appeler une fonction : nom(arguments)
  • Paramètre : variable nommée dans la définition.
  • Argument : valeur réellement passée à l'appel.
  • Valeur de retour : ce que la fonction « rend » via return.

Exemple complet — combiner ce qu'on a vu

Voici un programme qui réunit fonctions, conditions et boucles :

Le crochet [ … ] désigne une liste — un nouveau type de valeur, étudié plus en détail en NSI. Ici, elle sert simplement à parcourir plusieurs notes successivement avec for.
⏵ Ctrl+↵ pour exécuter
Aucune exécution pour l'instant.

Sortie attendue :

8 -> Insuffisant
11 -> Passable
14 -> Bien
17 -> Très bien
9 -> Insuffisant

On voit ici les quatre briques de ce chapitre travailler ensemble : une séquence d'instructions, des variables (notes, n), une bouclefor, des conditions dans la fonction, et une fonction qui retourne une valeur.

Pièges courants

  • Oublier les parenthèses à l'appel : saluer (sans parenthèses) ne déclenche pas la fonction. Il faut saluer().
  • Confondre print et return : print affiche à l'écran, return renvoie une valeur utilisable. Ce sont deux choses très différentes.
  • Définir une fonction après son premier appel : Python lit le fichier de haut en bas. Si vous appelez carre(5) avant la définition def carre(n):, vous obtiendrez une NameError.
  • Oublier l'indentation du corps : comme partout en Python, le corps de la fonction est décalé de 4 espaces.

Pour aller plus loin

Une fonction peut appeler une autre fonction, voire s'appeler elle-même (récursivité, à découvrir en NSI). C'est la base de la programmation modulaire : on construit de grands programmes en assemblant beaucoup de petites fonctions, chacune ayant un rôle clair et limité.