Ecrire des fonctions en Python
Mise à jour :
Les fonctions sont au cœur de la programmation en Python. Elles permettent de structurer le code, de le rendre plus lisible et de réutiliser des blocs sans avoir à les réécrire. En maîtrisant les fonctions, les développeurs peuvent écrire des programmes plus efficaces et maintenables.
Comprendre les fonctions
Une fonction est un bloc de code réutilisable qui exécute une tâche
spécifique. Pour définir une fonction, j’utilise le mot-clé def
suivi du
nom de la fonction et des parenthèses contenant éventuellement des
paramètres. Le code à exécuter se trouve dans le bloc indenté suivant.
Par exemple :
Pour appeler cette fonction, on écrit simplement :
Les paramètres et les arguments
Les fonctions peuvent accepter des paramètres pour traiter des données variables. Les paramètres sont les variables énumérées entre parenthèses dans la définition de la fonction. Lors de l’appel de la fonction, les valeurs fournies sont appelées arguments.
Exemple avec un paramètre :
Il est également possible de définir des paramètres par défaut. Si aucun argument n’est fourni lors de l’appel, ces paramètres prendront la valeur par défaut.
Exemple avec paramètre par défaut :
Les valeurs de retour
Une fonction peut renvoyer une valeur en utilisant le mot-clé return
.
Cette valeur peut ensuite être utilisée ailleurs dans le programme.
Exemple de fonction avec valeur de retour :
Si aucune valeur n’est spécifiée après return
, la fonction renvoie None
.
Les fonctions imbriquées
En Python, il est possible de définir une fonction à l’intérieur d’une autre. Cela peut être utile pour encapsuler une logique spécifique ou créer des closures.
Exemple de fonction imbriquée :
Les fonctions anonymes (lambda)
Les fonctions anonymes ou lambda, sont des fonctions sans nom définies en une seule ligne. Elles sont utiles pour des opérations simples et rapides.
Exemple de fonction lambda :
Les lambda sont souvent utilisées avec des fonctions intégrées comme
map()
, filter()
ou sorted()
.
Exemple avec map()
:
Les arguments variables (*args et **kwargs)
Pour créer des fonctions acceptant un nombre variable d’arguments, on
utilise *args
pour les arguments positionnels et **kwargs
pour les arguments
nommés.
Exemple avec *args
:
Exemple avec **kwargs
:
Les annotations de type
Depuis Python 3.5, il est possible d’ajouter des annotations de type aux paramètres et au type de retour des fonctions. Cela améliore la lisibilité du code et facilite la maintenance.
Exemple d’annotations de type :
Ces annotations sont informatives et n’affectent pas l’exécution du programme.
Les fonctions récursives
Une fonction récursive est une fonction qui s’appelle elle-même. C’est utile pour résoudre des problèmes pouvant être décomposés en sous-problèmes similaires.
Exemple de fonction récursive pour calculer la factorielle :
Exercices
Objectif :
Cet exercice est conçu pour vous familiariser avec les fonctions en Python, et plus précisément l’utilisation de différents types d’arguments : arguments obligatoires, arguments par défaut, arguments nommés, et arguments avec liste (variadics).
Vous devez une fonction qui calcule le prix total d’un repas dans un restaurant. Le prix total dépend des éléments suivants :
- Le prix des plats (entrée, plat principal, dessert).
- Un pourcentage de taxe appliqué au total (par défaut 10%).
- Un pourcentage de pourboire que le client peut choisir de donner (par défaut 15%).
Détails des arguments de la fonction :
-
Arguments obligatoires :
prix_entree
: Le prix de l’entrée.prix_plat
: Le prix du plat principal.prix_dessert
: Le prix du dessert.
-
Arguments optionnels avec des valeurs par défaut :
taxe
: Le pourcentage de taxe à ajouter au total (par défaut 10%).pourboire
: Le pourcentage de pourboire à ajouter au total (par défaut 15%).
-
Arguments variadics :
*extras
: Une liste de prix d’extras (par exemple boissons ou autres plats ajoutés). Ces éléments sont optionnels.
La fonction doit renvoyer le prix total du repas en incluant la taxe et le pourboire, ainsi que les extras, s’il y en a.
Voici un exemple de fonction répondant à l’énoncé :
Des exmples d’utilisation :
- Cas sans extras :
Sortie attendue :
- Cas avec extras :
Sortie attendue :
- Cas avec pourboire personnalisé :
Sortie attendue :
Bonnes pratiques pour écrire des fonctions en Python
Pour écrire des fonctions efficaces et maintenables en Python, il est important de suivre certaines bonnes pratiques. Ces principes améliorent la lisibilité du code, facilitent la collaboration entre développeurs et réduisent les risques d’erreurs.
Nommer les fonctions de manière claire et descriptive
Les noms de fonctions doivent refléter précisément leur rôle. Un nom clair permet de comprendre rapidement ce que fait la fonction sans avoir à lire son code interne.
Exemple :
Garder les fonctions courtes et spécifiques
Une fonction doit accomplir une seule tâche ou fonctionnalité spécifique. Cela facilite la compréhension, le test et la maintenance du code.
Exemple :
Au lieu de créer une fonction qui effectue plusieurs opérations, il est préférable de la diviser en fonctions plus petites.
Utiliser les docstrings pour documenter les fonctions
Les docstrings sont des chaînes de caractères placées immédiatement après la
définition d’une fonction pour la documenter. Elles permettent d’expliquer le
rôle de la fonction, ses paramètres, ses valeurs de retour et d’autres
informations utiles. En Python, les docstrings sont accessibles via
l’attribut __doc__
de la fonction ou avec la fonction help()
.
Exemple de docstring :
Dans cet exemple, la docstring explique ce que fait la fonction additionner
,
décrit les paramètres a
et b
, et indique ce que la fonction
retourne. Cette documentation est précieuse pour les autres développeurs ou
pour soi-même lors de la maintenance du code.
Pour consulter la docstring, il est possible d’utiliser help()
:
Ce qui affichera :
Bonnes pratiques pour les docstrings :
- Commencer par une phrase courte résumant le rôle de la fonction.
- Décrire les paramètres et les valeurs de retour de manière claire.
- Utiliser un style cohérent, comme le format reStructuredText ou Google Docstrings.
- Éviter les informations redondantes ou évidentes.
- Mettre à jour la docstring si la fonction est modifiée.
Les docstrings peuvent également être utilisées par des outils de génération de documentation automatique, ce qui facilite la création de documents complets sur le code.
Éviter les effets de bord
Une fonction doit idéalement être pure, c’est-à-dire qu’elle ne modifie pas l’état du programme en dehors de son scope et ne dépend pas de variables externes. Cela rend la fonction plus prévisible et facilite le débogage.
Exemple :
Éviter de modifier des variables globales à l’intérieur d’une fonction.
Utiliser les annotations de type
Les annotations de type améliorent la lisibilité du code et aident à détecter les erreurs potentielles. Elles indiquent les types attendus pour les paramètres et la valeur de retour.
Exemple :
Gérer les exceptions de manière appropriée
Il est important de prévoir et de gérer les erreurs potentielles au sein des fonctions pour éviter les plantages inattendus.
Exemple :
Éviter les arguments par défaut mutables
Utiliser des objets mutables comme valeurs par défaut peut entraîner des comportements inattendus.
Exemple problématique :
À chaque appel sans spécifier la liste, l’élément sera ajouté à la même liste, ce qui peut causer des bugs.
Solution :
Respecter les conventions de style
Suivre les conventions de style, comme celles définies dans PEP 8 ↗, rend le code plus cohérent et facile à lire.
Exemples de conventions :
- Utiliser des noms de fonctions en minuscules avec des underscores :
calculer_moyenne
- Indenter le code avec quatre espaces
- Limiter la longueur des lignes à 79 caractères
Conclusion
En maîtrisant les différents aspects des fonctions, tels que les paramètres, les arguments, les fonctions anonymes (lambda), les décorateurs, les générateurs et les bonnes pratiques de documentation, vous pouvez créer des programmes plus efficaces et élégants.
En appliquant les principes abordés dans ce guide, il est possible d’écrire des fonctions robustes et performantes, tout en respectant les standards de qualité du code en Python. La pratique régulière et l’expérimentation avec différents types de fonctions contribueront à renforcer les compétences en programmation et à tirer pleinement parti de la puissance du langage Python.