Programmation Python

Classe B3 ASO 2025-2026

Module 4

Fonctions et Méthodes

À l'issue de ce module, vous maîtriserez l'art de structurer votre code de manière modulaire en créant des fonctions réutilisables, en gérant efficacement les paramètres et les valeurs de retour, en comprenant la portée des variables, et en distinguant fonctions et méthodes.

1. Introduction aux Fonctions : Les Briques de Base

1.1 Pourquoi Utiliser des Fonctions ?

Une fonction encapsule une tâche spécifique dans un bloc de code nommé et réutilisable. Cela offre plusieurs avantages majeurs : la réutilisabilité (écrivez une fois, utilisez partout), la modularité (divisez les problèmes complexes en sous-problèmes simples), la lisibilité (un nom de fonction bien choisi documente votre intention), et la maintenance facilitée.

1.2 Anatomie d'une Fonction

Une fonction Python commence par le mot-clé def, suivi du nom, des parenthèses contenant les paramètres, et un deux-points. La docstring (chaîne de documentation) est une bonne pratique essentielle pour expliquer ce que fait la fonction.

def calculer_aire_cercle(rayon): """ Calcule l'aire d'un cercle à partir de son rayon. Args: rayon (float): Le rayon du cercle (doit être positif) Returns: float: L'aire du cercle Raises: ValueError: Si le rayon est négatif """ if rayon < 0: raise ValueError("Le rayon ne peut pas être négatif") import math aire = math.pi * rayon ** 2 return aire # Utilisation try: resultat = calculer_aire_cercle(5) print(f"L'aire d'un cercle de rayon 5 est : {resultat:.2f}") except ValueError as e: print(f"Erreur : {e}")

2. Paramètres et Arguments : La Communication

2.1 Types de Paramètres

Python offre une grande flexibilité :

def creer_profil(nom, age, ville="Paris", actif=True): profil = { "nom": nom, "age": age, "ville": ville, "statut": "Actif" if actif else "Inactif" } return profil # Appels avec différentes combinaisons profil1 = creer_profil("Alice", 25) profil2 = creer_profil("Bob", 30, ville="Lyon") profil3 = creer_profil("Charlie", 28, actif=False) print(f"Profil 1 : {profil1}") print(f"Profil 3 : {profil3}")

2.2 Arguments Variables : *args et **kwargs

*args collecte les arguments positionnels supplémentaires dans un tuple. **kwargs collecte les arguments nommés supplémentaires dans un dictionnaire.

# *args : nombre variable d'arguments positionnels def calculer_moyenne(*nombres): if not nombres: return 0 return sum(nombres) / len(nombres) print(f"Moyenne : {calculer_moyenne(10, 20, 30):.2f}") # **kwargs : nombre variable d'arguments nommés def creer_configuration(**options): config = {"debug": False, "timeout": 30} config.update(options) return config config1 = creer_configuration(debug=True, retry=5) print(f"Configuration : {config1}")

3. Valeurs de Retour et Portée des Variables

3.1 Gestion des Valeurs de Retour

Une fonction peut retourner n'importe quel type, y compris des structures complexes. Une fonction sans return explicite retourne None. Python permet de retourner plusieurs valeurs, qui sont regroupées dans un tuple.

# Retours multiples def diviser_avec_reste(dividende, diviseur): quotient = dividende // diviseur reste = dividende % diviseur return quotient, reste q, r = diviser_avec_reste(17, 5) print(f"17 ÷ 5 = {q} reste {r}")

3.2 Portée des Variables (Scope)

La portée détermine où une variable est accessible. Python suit la règle LEGB : Local, Enclosing, Global, Built-in. Les variables locales n'existent que dans leur fonction. Pour modifier une variable globale depuis une fonction, il faut utiliser le mot-clé global.

Piège Classique des Listes Mutables

N'utilisez jamais un objet mutable (comme une liste ou un dictionnaire) comme valeur par défaut pour un paramètre. Cette valeur est partagée entre tous les appels à la fonction. La bonne pratique est d'utiliser None par défaut et de créer une nouvelle liste à l'intérieur de la fonction.

4. Fonctions vs Méthodes : Comprendre la Distinction

4.1 Les Fonctions : Entités Indépendantes

Les fonctions sont autonomes et n'appartiennent à aucun objet. Elles sont appelées directement par leur nom (ex: print(), len()).

4.2 Les Méthodes : Fonctions Liées aux Objets

Les méthodes appartiennent à un objet et sont appelées avec la notation point (objet.methode()). Elles ont accès aux attributs de l'objet via leur premier paramètre, conventionnellement nommé self.

# Méthodes des types built-in texte = " Python Programming " print(f"Majuscules : '{texte.upper()}'") print(f"Sans espaces : '{texte.strip()}'") liste = [3, 1, 4, 1, 5] liste.sort() # Méthode qui modifie la liste en place print(f"Liste triée : {liste}")

5. Fonctions Avancées et Bonnes Pratiques

5.1 Décorateurs : Modifier le Comportement des Fonctions

Les décorateurs sont des fonctions qui modifient le comportement d'autres fonctions. Ils permettent d'ajouter des fonctionnalités (comme mesurer le temps d'exécution) sans altérer le code de la fonction originale.

5.2 Récursivité : Fonctions qui s'Appellent Elles-Mêmes

La récursivité est une technique où une fonction s'appelle elle-même pour résoudre un problème en le décomposant. Elle nécessite un "cas de base" pour arrêter les appels.

# Exemple classique : factorielle def factorielle(n): # Cas de base if n == 0 or n == 1: return 1 # Cas récursif return n * factorielle(n - 1) print(f"5! = {factorielle(5)}")

6. Exercices Pratiques

Exercice 1 : Gestionnaire de Bibliothèque

Créez un système de gestion de bibliothèque avec des fonctions pour ajouter des livres, rechercher par titre ou auteur, emprunter et retourner des livres.

Exercice 2 : Calculatrice Scientifique

Développez une calculatrice avec des fonctions pour les opérations de base, les fonctions trigonométriques, et la conversion d'unités.

Exercice 3 : Analyseur de Données

Créez des fonctions pour analyser des listes de nombres : moyenne, médiane, mode, écart-type, avec gestion des erreurs et validation des entrées.

7. Mini-Projet : Système de Gestion de Tâches

class GestionnaireTaches: def __init__(self): self.taches = [] self.id_suivant = 1 def ajouter_tache(self, description, priorite="normale"): tache = { "id": self.id_suivant, "description": description, "priorite": priorite, "completee": False } self.taches.append(tache) self.id_suivant += 1 def marquer_completee(self, id_tache): for tache in self.taches: if tache["id"] == id_tache: tache["completee"] = True return True return False # Utilisation gestionnaire = GestionnaireTaches() gestionnaire.ajouter_tache("Finir le module Python", priorite="haute") gestionnaire.ajouter_tache("Faire les courses") gestionnaire.marquer_completee(2) print(gestionnaire.taches)

8. Points Clés à Retenir

  • Les fonctions structurent le code en blocs logiques réutilisables.
  • *args et **kwargs permettent de créer des fonctions acceptant un nombre variable d'arguments.
  • La portée des variables suit la règle LEGB (Local, Enclosing, Global, Built-in).
  • Les méthodes sont des fonctions liées à des objets et ont accès à leurs attributs via self.

Pour aller plus loin

Source: EvoluNoob