Créer et utiliser des fonctions réutilisables
Introduction
Vous travaillez pour une petite entreprise et devez automatiser plusieurs tâches répétitives : renommer des fichiers, envoyer des rappels par e-mail, et calculer des statistiques sur des ventes. Chaque script que vous écrivez répète les mêmes blocs de code copiés-collés.
Votre défi
Votre collègue vous signale qu'un bug s'est glissé dans le calcul des statistiques... et qu'il faut le corriger dans 5 scripts différents ! Comment éviter ce problème à l'avenir ?
Bienvenue dans cette leçon consacrée aux fonctions en Python. C'est l'une des notions les plus puissantes pour transformer vos scripts en outils propres, robustes et faciles à maintenir. Fini le copier-coller : place au code réutilisable !
Qu'est-ce qu'une fonction ?
Une fonction est un bloc de code nommé qui réalise une tâche précise. On peut lui donner des informations (les paramètres), et elle peut nous renvoyer un résultat (la valeur de retour).
1# Définition d'une fonction simple
2def saluer(nom):
3 """Affiche un message de bienvenue personnalisé."""
4 print(f"Bonjour {nom}, bienvenue dans l'automatisation Python !")
5
6# Appel de la fonction
7saluer("Camille")
8saluer("Lucas")Résultat affiché :
1Bonjour Camille, bienvenue dans l'automatisation Python !
2Bonjour Lucas, bienvenue dans l'automatisation Python !💡 À retenir : Une fonction se définit une seule fois avec
def, mais peut être appelée autant de fois que nécessaire, avec des données différentes chaque fois.
Anatomie d'une fonction
Voici les éléments essentiels à connaître :
Exemple avec valeur de retour
1def calculer_total_ttc(prix_ht, taux_tva=0.20):
2 """Calcule le prix TTC à partir du prix HT et d'un taux de TVA."""
3 total = prix_ht * (1 + taux_tva)
4 return round(total, 2)
5
6# Utilisation avec valeur par défaut
7prix1 = calculer_total_ttc(100)
8print(prix1) # 120.0
9
10# Utilisation avec paramètre personnalisé
11prix2 = calculer_total_ttc(100, 0.055)
12print(prix2) # 105.5🎯 En pratique : Utilisez des paramètres par défaut (comme
taux_tva=0.20) pour rendre vos fonctions flexibles tout en gardant un comportement standard pratique.
Pourquoi utiliser des fonctions ? Comparatif
| Critère | Sans fonctions (copier-coller) | Avec fonctions |
|---|---|---|
| Lisibilité du code | Faible, répétitif | Élevée, structurée |
| Maintenance | Modifier le bug partout | Modifier en un seul endroit |
| Réutilisabilité | Nulle, tout est figé | Totale, réutilisable dans d'autres scripts |
| Test et débogage | Difficile | Facile (on teste la fonction isolément) |
| Collaboration en équipe | Compliquée | Simplifiée (fonctions = briques claires) |
Le flux d'exécution d'un appel de fonction
Paramètres, arguments et portée des variables
Une confusion fréquente chez les débutants concerne la portée des variables (scope) : une variable créée à l'intérieur d'une fonction n'existe pas à l'extérieur.
1def calculer_moyenne(notes):
2 total = sum(notes) # "total" existe seulement ici
3 moyenne = total / len(notes)
4 return moyenne
5
6resultat = calculer_moyenne([12, 15, 18, 9])
7print(resultat) # 13.5
8print(total) # ❌ Erreur ! "total" n'existe pas en dehors de la fonction⚠️ Attention : Les variables définies à l'intérieur d'une fonction sont "locales" : elles disparaissent une fois la fonction terminée. Pour récupérer un résultat, utilisez toujours
return.
Automatiser une tâche concrète : renommer des fichiers
Voici un exemple réaliste d'automatisation avec une fonction réutilisable :
1import os
2
3def renommer_fichiers(dossier, prefixe):
4 """Ajoute un préfixe à tous les fichiers d'un dossier."""
5 for nom_fichier in os.listdir(dossier):
6 chemin_actuel = os.path.join(dossier, nom_fichier)
7 nouveau_nom = f"{prefixe}_{nom_fichier}"
8 chemin_nouveau = os.path.join(dossier, nouveau_nom)
9 os.rename(chemin_actuel, chemin_nouveau)
10 print(f"{len(os.listdir(dossier))} fichiers renommés dans {dossier}")
11
12# On peut réutiliser cette fonction pour n'importe quel dossier
13renommer_fichiers("photos_vacances", "2024")
14renommer_fichiers("factures", "archive")Cette fonction peut être utilisée dans tous vos futurs scripts d'automatisation, sans jamais réécrire la logique.
Testez vous-même : simulateur de fonction
Simulateur : fonction de calcul de remise
Modifiez le prix et le pourcentage de remise pour voir le résultat calculé par une fonction Python équivalente.
Le saviez-vous ?
Le saviez-vous ?
Le concept de fonction réutilisable existe depuis les années 1950 ! Le langage FORTRAN, l'un des premiers langages de programmation, introduisait déjà des 'sous-programmes' similaires aux fonctions modernes.
— Histoire de la programmation - FORTRAN (1957)
Bonnes pratiques à connaître
💡 À retenir : Une bonne fonction porte un nom qui décrit son action (verbe à l'infinitif comme
calculer_,envoyer_,renommer_) et ne fait qu'une seule chose.
⚠️ Attention : Ne confondez pas
print()etreturn.print()affiche seulement à l'écran, alors quereturnrenvoie une valeur utilisable ensuite dans votre programme (calculs, conditions, etc.).
Mini-quiz
Que se passe-t-il si une fonction n'utilise pas 'return' ?
En bref
- 1Une fonction se définit avec 'def' et permet de regrouper du code réutilisable pour éviter les répétitions.
- 2Les paramètres permettent de personnaliser le comportement d'une fonction, et 'return' permet de récupérer un résultat exploitable ailleurs dans le programme.
- 3Bien nommer ses fonctions et leur donner une seule responsabilité rend le code plus lisible, plus facile à tester et à maintenir dans le temps.