Aller au contenu principal

Les fonctions et leurs paramètres

Ce que ce chapitre apporte 6 points
  • Expliquer l'intérêt de structurer un programme en fonctions.
  • Définir une fonction, l'appeler, et employer la valeur qu'elle retourne.
  • Distinguer paramètre, argument et valeur de retour, et prévoir l'effet d'une modification du paramètre, qui n'est qu'une copie de l'argument.
  • Suivre ce qui se passe pendant un appel : interruption, passage des valeurs, retour.
  • Déterminer ce qu'une fonction voit et ne voit pas, dans les deux sens, et expliquer pourquoi ses variables disparaissent.
  • Repérer ce qui change sur ces points en passant à Python.

Sur une ligne d'usinage, le même contrôle revient à trois endroits du programme de suivi : à la réception des pièces brutes, après le tournage, avant l'expédition. Chaque fois, il s'agit de dire si un diamètre tient dans sa tolérance. Recopier ce test trois fois est la garantie qu'au jour où la tolérance changera, on corrigera deux copies et pas la troisième. Une fonction donne à ce traitement un nom, des entrées et une sortie : on l'écrit une fois, on l'appelle partout. C'est aussi ce qui permet de lire un algorithme long sans le lire en entier.

La question est donc double : comment écrire ce contrôle une seule fois, et comment l'appeler de trois endroits sans qu'un appel dérange les deux autres ? Le chapitre s'appuie sur les variables et l'affectation, sur les conditions, qui écrivent le test lui-même, et sur les tableaux, qu'une fonction peut recevoir.

Les chapitres précédents écrivaient chaque algorithme d'un seul bloc, du début à la fin. Le chapitre sur les tableaux a pourtant déjà employé une fonction, sans s'y attarder : longueur, qui reçoit un tableau et rend son nombre de cases. Ce chapitre montre comment écrire les siennes, et surtout ce qui se passe exactement quand on les appelle : ce qui entre, ce qui sort, et ce que la fonction ne voit pas.

Qu'est-ce qu'une fonction ?

Définition

Une fonction est un bloc d'instructions regroupées sous un nom, qui exécute une tâche précise. Une fois définie, elle peut être appelée plusieurs fois depuis différents endroits de l'algorithme.

On peut comparer une fonction à une machine-outil dans un atelier : elle porte un nom, on lui fournit éventuellement des pièces à l'entrée, et elle produit un résultat, ou se contente d'effectuer une opération.

Algorithme
pas 1 / 6
Fonction Bonjour()
Écrire "Bonjour !"
FinFonction
Début
Bonjour()
Bonjour()
Fin

programme principal

aucune variable

Cet algorithme définit une fonction Bonjour qui affiche un message, puis l'appelle deux fois depuis le programme principal. Plutôt que de recopier les mêmes instructions, on les regroupe dans une seule fonction réutilisable.

Écrire une fonction, puis l'appeler

La structure générale d'une fonction est la suivante :

Algorithme
Fonction nom()
instructions
FinFonction

et pour l'appeler :

nom()

Fonction ouvre la définition, FinFonction la ferme, et les parenthèses qui suivent le nom recevront plus loin les paramètres. Définir une fonction n'exécute rien : son corps ne s'exécute qu'au moment où une ligne l'appelle, par son nom suivi de parenthèses. Dans un algorithme complet, les fonctions s'écrivent en premier, avant le Début ; le programme principal, entre Début et Fin, vient ensuite et les appelle.

L'intérêt est de factoriser le code : une action qui se répète s'écrit une seule fois, dans une fonction, puis s'appelle à chaque besoin.

Algorithme
pas 1 / 7
Fonction Ligne()
Écrire "----------"
FinFonction
Début
Ligne()
Écrire "Rapport de production"
Ligne()
Fin

programme principal

aucune variable

Ce qui s'affiche :

----------
Rapport de production
----------

Les deux traits encadrent le titre, et c'est tout l'intérêt de l'exemple : la même instruction sert deux fois, à deux endroits, sans être recopiée. Changer la longueur du trait se fait alors à un seul endroit.

Paramètres et arguments

Définition

Un paramètre est une variable nommée dans l'en-tête de la fonction, qui attend une valeur. Un argument est la valeur effectivement fournie au moment de l'appel. Dans Fonction Bonjour(nom), nom est le paramètre ; dans Bonjour("Alice"), "Alice" est l'argument. Le paramètre s'écrit une fois, l'argument change à chaque appel.

Algorithme
pas 1 / 6
Fonction Bonjour(nom)
Écrire "Bonjour ", nom, " !"
FinFonction
Début
Bonjour("Alice")
Bonjour("Bob")
Fin

programme principal

aucune variable

Quand on appelle Bonjour("Alice"), le paramètre nom est créé et reçoit une copie de l'argument : c'est le passage par valeur. La fonction travaille sur cette copie le temps de l'appel, et l'appelant garde sa propre valeur ; un tableau passé en argument est copié de la même façon, case par case. La section sur la portée montre ce que cette copie protège. La fonction devient ainsi un modèle, que l'on réutilise avec des valeurs différentes.

Une fonction peut recevoir plusieurs paramètres, séparés par des virgules ; les arguments leur sont attribués dans l'ordre, le premier au premier, le deuxième au deuxième. La section suivante en donne un exemple.

Valeur de retour

Définition

Une fonction peut rendre une valeur au programme qui l'appelle, avec l'instruction Retourner, le seul mot de retour du cours. Cette valeur peut ensuite être rangée dans une variable ou employée dans un calcul.

Algorithme
pas 1 / 5
Fonction Carré(x)
Retourner x * x
FinFonction
Début
a ← 5
resultat ← Carré(a)
Écrire "Carré de ", a, " = ", resultat
Fin

programme principal

a5

La fonction Carré calcule le carré du nombre reçu et le rend au programme principal, qui le range dans resultat. Elle ne se contente plus d'agir : elle produit un résultat réutilisable.

Une fonction qui ne retourne rien, comme Bonjour ou Ligne, se contente d'agir ; certains cours l'appellent une procédure. Son appel s'écrit seul sur sa ligne, et ne peut pas servir de valeur : x ← Ligne() arrête l'algorithme, faute de valeur à ranger.

Avec plusieurs paramètres, le principe ne change pas. Cette fonction calcule un prix soldé, à partir du prix et du taux de remise en pourcentage :

Algorithme
pas 1 / 6
Fonction PrixRemise(prix, taux)
Retourner prix * (100 - taux) / 100
FinFonction
Début
Écrire "Prix soldé : ", PrixRemise(80, 25), " euros"
Écrire "Prix soldé : ", PrixRemise(120, 10), " euros"
Fin

programme principal

aucune variable

Deux paramètres, et deux arguments attribués dans l'ordre : au premier appel, 80 va au prix et 25 au taux, soit 60 euros. Parce que la fonction retourne son résultat au lieu de l'afficher, l'appelant en fait ce qu'il veut : ici l'écrire, ailleurs l'ajouter à des frais de port ou le comparer à un budget. C'est la règle à retenir : une bonne fonction effectue une tâche précise et rend un résultat clair.

Vérification rapideon peut se reprendre

Écrire 2 * x et Retourner 2 * x dans une fonction : quelle différence ?

Ce qui se passe pendant un appel

Un appel interrompt le programme principal, crée les paramètres, exécute le corps de la fonction, puis rend la main. Voici l'enchaînement exact, sur resultat ← Carré(5).

  1. Le programme principal s'interrompt sur cette ligne. Il ne continue pas en parallèle : il attend.
  2. Le paramètre x de la fonction est créé et reçoit une copie de la valeur 5.
  3. Le corps de la fonction s'exécute, et lui seul.
  4. Retourner x * x calcule 25, sort immédiatement de la fonction, et rend cette valeur.
  5. Le paramètre x cesse d'exister.
  6. Le programme principal reprend là où il s'était arrêté, Carré(5) ayant été remplacé par 25.
Algorithme
pas 1 / 5
Fonction Carré(x)
Retourner x * x
FinFonction
Début
a ← 5
resultat ← Carré(a)
Écrire "Carré de ", a, " vaut ", resultat
Fin

programme principal

a5
À manipuler
Avancer d'un pas à la fois avec « suivant ▶ », en regardant les encadrés placés sous le listing : les six étapes tiennent en trois pas, du pas 2 au pas 4. Au pas 2, sur la ligne d'appel, un seul encadré, celui du programme principal : a y vaut 5, et resultat n'existe pas encore. Au pas 3, un second encadré marqué Carré s'ouvre à côté, avec x qui vaut 5, et celui du programme principal pâlit : il attend. Au pas 4, de retour sur la ligne d'appel, l'encadré de Carré a disparu et resultat vaut 25. Noter ce que contient l'encadré du programme principal à chacun de ces trois pas, et constater que x n'y figure jamais.

L'encadré de Carré n'existe que pendant l'appel : c'est la portée, que le chapitre décrit plus bas, et elle se voit avant de se définir.

La ligne d'appel se lit comme une valeur. Une fois la fonction terminée, Carré(5) ne se lit plus comme un appel mais comme le nombre 25. C'est pourquoi on peut écrire resultat ← Carré(5) + 1, ou passer l'appel directement à Écrire. Une fonction qui retourne une valeur s'emploie partout où l'on écrirait cette valeur.

L'inverse est une erreur silencieuse : Carré(5), écrit seul sur une ligne, calcule 25 et le jette. Une valeur retournée qu'on ne range nulle part est perdue.

Vérification rapideon peut se reprendre

1.Pendant l'exécution de resultat ← Carré(5), que fait le programme principal ?

2.Après v ← Carré(5), la variable x de la fonction vaut quoi dans le programme principal ?

La portée : ce qu'une fonction voit et ne voit pas

C'est le point qui surprend le plus, et il découle de l'étape 5 ci-dessus.

Définition

La portée d'une variable est la partie de l'algorithme où elle existe. Les variables créées dans une fonction, paramètres compris, n'existent que pendant son exécution : on dit qu'elles sont locales. Celles du programme principal n'existent que dans le programme principal. Aucun des deux ne voit les variables de l'autre.

Ce que le programme principal ne voit pas

Algorithme
pas 1 / 6
Fonction Carré(x)
resultat ← x * x
Retourner resultat
FinFonction
Début
v ← Carré(5)
Écrire v // 25, la valeur a bien été rendue
Écrire x // ERREUR : x n'existe pas ici
Écrire resultat // ERREUR : resultat non plus
Fin

programme principal

aucune variable

L'avant-dernière ligne échoue, et c'est voulu ; la dernière échouerait de la même façon, mais l'algorithme s'est arrêté avant. x et resultat appartiennent à la fonction ; le programme principal ne les a jamais vues. La seule chose qui ressort d'une fonction est ce qu'elle retourne.

Ce que la fonction ne voit pas

La frontière vaut dans les deux directions : une fonction ne voit pas davantage les variables du programme principal. Tout ce dont elle a besoin doit lui arriver par un paramètre.

Algorithme
pas 1 / 3
Fonction EnAlerte(mesure)
Retourner mesure > seuil
FinFonction
Début
seuil ← 80
Écrire EnAlerte(95)
Fin

programme principal

seuil80

La figure s'arrête sur la ligne 2 : seuil existe bien, et l'encadré du programme principal le montre, mais la fonction n'y a pas accès. La correction fait entrer le seuil par la porte prévue, un second paramètre :

Algorithme
pas 1 / 4
Fonction EnAlerte(mesure, seuil)
Retourner mesure > seuil
FinFonction
Début
seuil ← 80
Écrire EnAlerte(95, seuil)
Fin

programme principal

seuil80

La figure corrigée affiche Vrai : 95 dépasse le seuil de 80. Le paramètre porte le même nom que la variable du programme principal, mais ce sont deux variables distinctes ; l'encadré marqué EnAlerte montre la copie que la fonction a reçue.

Une copie, pas la variable

Au moment de l'appel, c'est la valeur de l'argument qui est copiée dans le paramètre, pas la variable elle-même. Modifier le paramètre ne touche donc pas la variable de l'appelant, même quand les deux portent le même nom.

Algorithme
pas 1 / 6
Fonction AppliquerRemise(prix)
prix ← prix * 0.9
Retourner prix
FinFonction
Début
prix ← 50
solde ← AppliquerRemise(prix)
Écrire "Prix : ", prix, ", prix soldé : ", solde
Fin

programme principal

prix50

La figure affiche « Prix : 50, prix soldé : 45 » : les deux prix sont deux boîtes distinctes, l'une dans la fonction, l'autre dans le programme principal, et seul ce que Retourner rend traverse la frontière. Un tableau passé en argument est copié lui aussi :

Algorithme
pas 1 / 5
Fonction EffacerPremier(t)
t[1] ← 0
FinFonction
Début
releves ← [12, 7, 15]
EffacerPremier(releves)
Écrire "Premier relevé : ", releves[1]
Fin

programme principal

releves[12, 7, 15]

La fonction met à zéro la première case de sa copie ; celle de l'appelant garde 12. C'est une protection : appeler une fonction ne peut pas modifier en douce les variables de l'appelant, et c'est ce qui permet de réutiliser une fonction sans la relire.

La conséquence pratique

Une fonction ne communique avec le reste du programme que par deux portes : ses paramètres à l'entrée, sa valeur de retour à la sortie. Tout ce qui doit entrer passe par un paramètre, tout ce qui doit sortir passe par Retourner.

Une fonction qui aurait besoin de dix informations extérieures pour travailler est le signe qu'elle en fait trop, et qu'il faut la couper en deux.

Et en Python

Le parcours Python montre un langage moins strict sur deux points. Une liste passée en paramètre n'y est pas recopiée : la fonction reçoit la liste de l'appelant elle-même, et EffacerPremier y mettrait bien à zéro le premier relevé du programme principal. Et une fonction peut y lire une variable du programme principal, qu'on appelle alors une variable globale : la première version d'EnAlerte y fonctionnerait sans second paramètre. La règle de ce chapitre reste la bonne pratique, tout entre par les paramètres et tout sort par le retour ; mais en Python, c'est au programmeur de s'y tenir, le langage ne l'impose plus.

Vérification rapideon peut se reprendre

1.Une fonction a un paramètre x, et le programme principal a aussi une variable x. Que se passe-t-il ?

2.Dans ce cours, une fonction reçoit un tableau et exécute t[1] ← 0. Que devient le tableau de l'appelant ?

3.Par où une fonction communique-t-elle avec le reste du programme ?

Mettre en pratique

Un appel se lit comme la valeur qu'il rend. Chaque question se résout en remplaçant les appels par leurs valeurs, du plus intérieur au plus extérieur, sans perdre de vue qu'un paramètre reçoit une copie.

Ce que rendent les appels

  • 1.

    Avec la fonction PrixRemise(prix, taux) du chapitre, quel prix, en euros, rend l'appel PrixRemise(250, 12) ?

  • 2.

    Les deux arguments écrits dans l'autre ordre, PrixRemise(12, 250) : que rend l'appel ?

  • 3.

    Avec la fonction TTC de l'exercice 1, qui ajoute 20 % de TVA, que rend TTC(PrixRemise(80, 25)), en euros ?

  • 4.

    Avec Carré et la fonction Moyenne(a, b) de l'exercice 2, que rend Moyenne(Carré(3), Carré(5)) ?

  • 5.

    Le programme principal exécute prix ← 200, puis solde ← AppliquerRemise(prix), avec la fonction de la section sur la portée. Que vaut ensuite prix - solde ?

Chaque exercice demande la fonction et son appel : une fonction qu'on n'appelle jamais ne sert à rien.

Écrire une fonction TTC(ht) qui rend le prix toutes taxes comprises d'un prix hors taxes, la TVA étant de 20 %, et l'appeler pour un prix de 50 euros.
Algorithme
pas 1 / 4
Fonction TTC(ht)
Retourner ht * 1.2
FinFonction
Début
prix ← TTC(50)
Écrire "Prix TTC de 50 euros HT : ", prix, " euros"
Fin

programme principal

aucune variable

Ajouter 20 % revient à multiplier par 1,2. Retourner rend la valeur et sort immédiatement de la fonction. Le programme principal récupère cette valeur dans prix, comme si TTC(50) était le nombre 60.

Afficher au lieu de retourner

Écrire Écrire ht * 1.2 à l'intérieur de la fonction au lieu de Retourner ht * 1.2. La fonction affiche alors le résultat mais ne le rend pas : impossible de le réutiliser dans un calcul, par exemple pour additionner les prix d'une commande. Afficher et retourner ne sont pas la même chose.

Écrire une fonction Moyenne(a, b) qui rend la moyenne de deux mesures, et la tester avec 10 et 16.
Algorithme
pas 1 / 3
Fonction Moyenne(a, b)
Retourner (a + b) / 2
FinFonction
Début
Écrire "Moyenne de 10 et 16 : ", Moyenne(10, 16)
Fin

programme principal

aucune variable

Les parenthèses autour de a + b sont indispensables : sans elles, a + b / 2 calculerait a + (b / 2), soit 18 au lieu de 13. La division passe avant l'addition, comme en mathématiques.

On peut appeler la fonction directement dans le Écrire : la valeur retournée prend la place de l'appel.

Une pièce est conforme si son diamètre est compris entre 19,5 et 20,5 mm, bornes comprises. Écrire une fonction EstConforme(diametre) qui rend Vrai si la pièce est conforme, Faux sinon, et l'employer sur un diamètre lu.
Algorithme
pas 1 / 6
séparées par des virgules, décimales au point
Fonction EstConforme(diametre)
Si diametre >= 19.5 ET diametre <= 20.5 Alors
Retourner Vrai
Sinon
Retourner Faux
FinSi
FinFonction
Début
Lire d
Si EstConforme(d) Alors
Écrire "Pièce conforme"
Sinon
Écrire "Pièce à reprendre"
FinSi
Fin

programme principal

dsaisi20,3

Une fonction peut rendre un booléen, c'est-à-dire Vrai ou Faux. Elle s'emploie alors directement comme condition : Si EstConforme(d) Alors se lit « si la pièce est conforme ».

Version plus courte, puisque la comparaison produit déjà un booléen :

Algorithme
Fonction EstConforme(diametre)
Retourner diametre >= 19.5 ET diametre <= 20.5
FinFonction

Les bornes comprises s'écrivent >= et <= : avec > et <, une pièce à 20,5 mm exactement, pourtant dans la tolérance, serait mise à reprendre.

Chapitre révisé en octobre 2026 · Une erreur dans ce chapitre ?

Dans la bibliothèque d'exercices