Menu
Français

Fonctions Python : def, return, arguments par défaut et arguments nommés

Comment définir et utiliser des fonctions en Python — paramètres, valeurs de retour, arguments par défaut, arguments nommés et habitudes de nommage qui gardent le code lisible.

Une fonction, c'est un bloc d'étapes nommé

Chaque fois que tu te retrouves à écrire les mêmes quelques lignes plus d'une fois — ou que tu veux donner un nom à un petit morceau de logique — tu es prêt à écrire une fonction. Les fonctions sont le premier vrai outil pour gérer la complexité dans un programme Python.

La forme de base :

main.py
Output
Click Run to see the output here.

Décomposons :

  • def est le mot-clé qui commence une définition de fonction.
  • greet est le nom de la fonction.
  • (name) est la liste de paramètres — les entrées que la fonction prend.
  • Le deux-points termine l'en-tête ; le bloc indenté en dessous est le corps.
  • greet("Ada") est un appel. Python exécute le corps avec name lié à "Ada".

Les fonctions restent dormantes jusqu'à ce qu'elles soient appelées. En définir une ne l'exécute pas. L'appeler avec greet("Ada"), si.

Paramètres et arguments

Le mot paramètre est le nom à l'intérieur de la définition de fonction. Le mot argument est la valeur passée lors de l'appel. Pas énorme dans une conversation décontractée, mais la distinction aide à lire les messages d'erreur.

main.py
Output
Click Run to see the output here.

Ici base et exponent sont des paramètres. 2 et 10 sont des arguments. Python les lie dans l'ordre : premier argument au premier paramètre, et ainsi de suite.

return : renvoyer une valeur

print écrit à l'écran. return rend une valeur à l'appelant pour qu'il puisse l'utiliser :

main.py
Output
Click Run to see the output here.

Sans return, une fonction renvoie None par défaut :

main.py
Output
Click Run to see the output here.

return fait aussi sortir la fonction immédiatement. Tu verras souvent des returns précoces utilisés pour se débarrasser des cas limites avant la logique principale :

main.py
Output
Click Run to see the output here.

Les returns précoces évitent que le corps principal soit profondément imbriqué dans des if/else.

Arguments par défaut

Un paramètre peut avoir une valeur par défaut, utilisée quand l'appelant n'en fournit pas :

main.py
Output
Click Run to see the output here.

Tous les paramètres avec défauts doivent venir après les paramètres sans défauts. def f(a, b=1, c): est une erreur de syntaxe.

Le piège des défauts mutables

C'est le piège Python le plus célèbre. Regarde :

main.py
Output
Click Run to see the output here.

Tu t'attendrais à ce que chaque appel parte d'une liste vide. En fait, la liste par défaut est partagée entre les appels, et les éléments s'accumulent. Python évalue le défaut une fois, quand la fonction est définie, et réutilise cette unique liste pour toujours.

Le motif sûr, c'est d'utiliser None comme défaut et de créer la liste à l'intérieur de la fonction :

main.py
Output
Click Run to see the output here.

Maintenant, chaque appel qui ne passe pas items reçoit une liste fraîche. Cette règle s'applique aux listes, dicts, sets — à tout ce qui est mutable.

Arguments nommés

Tu peux passer les arguments par nom plutôt que par position. Ça te laisse sauter des paramètres du milieu et rend les appels longs plus lisibles :

main.py
Output
Click Run to see the output here.

Les arguments positionnels et nommés peuvent se mélanger, mais les positionnels doivent venir en premier :

main.py
Output
Click Run to see the output here.

Dès qu'une fonction a plus de trois ou quatre paramètres, favoriser les arguments nommés rend les appels bien plus faciles à lire.

Paramètres positional-only et keyword-only

Python te permet de marquer certains paramètres comme appelables seulement par position (avec /) ou seulement par mot-clé (avec *) :

main.py
Output
Click Run to see the output here.

Tu n'as pas besoin de ça dès le premier jour. Ils deviennent utiles quand tu conçois des API et veux verrouiller la façon dont les appelants utilisent ta fonction.

Docstrings et nommage

La première ligne dans une fonction peut être une docstring — une chaîne à triple guillemets que Python traite comme documentation :

main.py
Output
Click Run to see the output here.

Des outils comme help(), les tooltips d'IDE et les générateurs de documentation lisent la docstring automatiquement. Une ligne vaut bien mieux que rien du tout.

Et s'il te plaît, pense au nommage :

  • Les noms de fonction devraient être des verbes : fetch_profile, compute_total, is_valid.
  • Utilise lower_snake_case.
  • Les fonctions qui renvoient un booléen commencent souvent par is_, has_ ou can_.

Un bon nom rend le site d'appel auto-explicatif sans avoir besoin d'un commentaire.

Les fonctions pures sont plus faciles à raisonner

Une fonction pure renvoie la même sortie pour la même entrée et n'a pas d'effets de bord — elle ne modifie pas d'état global, n'écrit pas sur stdout (autre que pour du debug), ne touche pas aux fichiers.

main.py
Output
Click Run to see the output here.

Les deux ont leur place, mais dans du code que tu veux réutiliser et tester, pousse vers les fonctions pures autant que possible.

Un petit exemple qui marche

Une fonction rapide qui combine défauts, arguments nommés et return :

main.py
Output
Click Run to see the output here.

Ensuite : listes d'arguments flexibles

Parfois tu ne sais pas combien d'arguments une fonction sera appelée avec — ou tu veux transférer quels que soient les arguments qui arrivent à une autre fonction. *args et **kwargs gèrent ça. C'est pour la page suivante.

Questions fréquentes

Comment définir une fonction en Python ?

Utilise le mot-clé def, suivi du nom de la fonction, de parenthèses pour les paramètres, et d'un deux-points. Le bloc indenté en dessous est le corps de la fonction. Exemple : def greet(name): print(f'Hi, {name}').

Que fait return en Python ?

return renvoie une valeur à qui a appelé la fonction. Une fonction sans return explicite renvoie None automatiquement. Une fois que return s'exécute, la fonction sort immédiatement — tout code après lui dans le même bloc est sauté.

Qu'est-ce que les arguments par défaut en Python ?

Les arguments par défaut laissent un paramètre avoir une valeur pré-définie utilisée si l'appelant n'en fournit pas. def greet(name='friend'): veut dire greet() sans arguments utilise 'friend'. N'utilise jamais de défauts mutables comme [] — voir plus bas pour le motif sûr.

Apprendre à coder avec Coddy

COMMENCER