Cours de Python / Définir des fonctions et renvoyer des résultats avec return
Une fonction donne un nom à un traitement, reçoit des entrées par ses paramètres et renvoie un résultat avec return. Renvoyer une valeur et l’afficher avec print() sont deux opérations différentes : séparer calcul et affichage permet de réutiliser le résultat.
Distinguer paramètres, arguments et valeur de retour
L’instruction def est suivie du nom de la fonction, de ses paramètres entre parenthèses et d’un deux-points. Le corps est indenté. Les paramètres sont les noms figurant dans la définition ; les arguments sont les valeurs transmises lors d’un appel. Définir une fonction crée ce traitement nommé, mais n’exécute pas son corps.
Dans total_with_fee(8000, 500), les arguments 8000 et 500 sont associés respectivement aux paramètres amount et fee. L’instruction return amount + fee fournit leur somme au code appelant et termine cet appel. Atteindre la fin sans return, ou exécuter un return sans expression, renvoie None.
Un calcul réutilisable peut renvoyer son résultat sans rien afficher. La partie appelante choisit alors de l’afficher, de l’additionner à un autre résultat ou de le vérifier. La documentation Python sur la définition des fonctions précise ces règles et le rôle des paramètres.
Appeler une fonction et réutiliser ses résultats
Le programme utilise Python 3 et sa bibliothèque standard. Enregistrez le bloc complet ci-dessous dans functions.py, en UTF-8, dans un dossier d’exercice. Avec l’environnement virtuel du projet activé, ouvrez le terminal dans ce dossier et lancez python functions.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 functions.py si votre interpréteur porte ce nom.
def total_with_fee(amount, fee):
"""Return the sum of the amount and fee."""
return amount + fee
first = total_with_fee(8000, 500)
second = total_with_fee(3500, 0)
print(first, second)
print(first + second)
Le résultat attendu est :
8500 3500
12000
Le premier appel renvoie 8500, conservé dans first ; le deuxième renvoie 3500, conservé dans second. La dernière ligne additionne ces deux résultats et affiche 12000. Les appels de calcul n’impriment rien eux-mêmes : les deux lignes visibles proviennent des deux print du code appelant.
La chaîne en anglais placée au début du corps est une chaîne de documentation, ou docstring. Elle signifie « renvoie la somme du montant et des frais ». Elle documente le traitement sans afficher de message et sans valider les données à elle seule.
Définir une responsabilité et un contrat de données
La fonction suppose ici deux valeurs numériques pouvant être additionnées. Elle ne vérifie ni la devise, ni l’interdiction des négatifs, ni l’emploi exclusif d’entiers. Si ces contraintes sont nécessaires, validez-les à une frontière adaptée et documentez ce que la fonction accepte. Une docstring ne doit pas promettre un contrôle que le code n’effectue pas.
Le comportement de + dépend des objets : deux chaînes pourraient être concaténées au lieu d’être additionnées comme des montants. Une chaîne et un entier provoqueraient une TypeError. Le nom total_with_fee exprime une intention, mais ne remplace pas le contrat des entrées.
| Instruction | Valeur fournie à l’appelant | Affichage |
|---|---|---|
return total |
La valeur de total ; termine l’appel | Aucun par cette instruction |
print(total) |
La fonction print renvoie None | Affiche total ; la fonction qui l’appelle peut continuer |
Une fonction qui affiche avec print peut aussi renvoyer une valeur par une instruction ultérieure ; elle ne renvoie pas nécessairement None simplement parce qu’elle affiche quelque chose. Dans la variante de l’exercice qui remplace l’unique return par un affichage, c’est l’arrivée à la fin du corps sans retour explicite qui produit None.
Tester les appels et repérer les résultats manquants
- Dans le premier appel uniquement, remplacez 500 par 1000. Vous devez lire
9000 3500, puis 12500. Restaurez ensuite les frais à 500. - Dans la fonction, remplacez seulement
return amount + feeparprint(amount + fee). Les deux appels affichent d’abord 8500 et 3500 séparément ;print(first, second)affiche ensuiteNone None. L’addition finale provoque uneTypeError, car ces variables ne contiennent plus des nombres. Restaurez le retour initial. - Placez temporairement un appel
total_with_fee(8000, 500)avant la lignedef, dans un nouveau lancement du script. UneNameErrorapparaît puisque la définition n’a pas encore été exécutée. Supprimez cet appel de test. - Essayez un appel ne fournissant que 8000 : les frais sont obligatoires dans cette définition, donc une
TypeErrorsignale l’argument manquant. Retirez cet essai et retrouvez les deux lignes de référence.
Les paramètres de l’appel sont des noms locaux à la fonction : lire amount directement après le programme ne donne pas accès à son paramètre local. Transmettez les valeurs utiles par les arguments et récupérez les résultats avec return, plutôt que de dépendre d’un état extérieur caché. Gardez aussi chaque responsabilité claire : la saisie utilisateur, le calcul et l’écriture d’un fichier n’ont pas besoin d’être réunis dans une même fonction.




