À 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é :
Paramètres positionnels : obligatoires, leur ordre compte.
Paramètres par défaut : optionnels, une valeur est fournie si l'argument n'est pas passé.
Paramètres nommés : permettent de passer des arguments sans se soucier de l'ordre.
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.