Lecture libre, sans compteChapitre 4 · Aller plus loin dans l'automatisation

Créer et utiliser des fonctions réutilisables

Introduction

Mise en situation

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).

python
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é :

text
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

python
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èreSans fonctions (copier-coller)Avec fonctions
Lisibilité du codeFaible, répétitifÉlevée, structurée
MaintenanceModifier le bug partoutModifier en un seul endroit
RéutilisabilitéNulle, tout est figéTotale, réutilisable dans d'autres scripts
Test et débogageDifficileFacile (on teste la fonction isolément)
Collaboration en équipeCompliquéeSimplifié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.

python
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 :

python
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() et return. print() affiche seulement à l'écran, alors que return renvoie une valeur utilisable ensuite dans votre programme (calculs, conditions, etc.).

Mini-quiz

Mini-Quiz
Question 1 / 3

Que se passe-t-il si une fonction n'utilise pas 'return' ?

En bref

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.