En bref
- Approfondissez vos connaissances sur les fonctions Python : paramètres par défaut, fonctions lambda, décorateurs et récursion.
Les fonctions avancées en Python#
Maintenant que vous maîtrisez les bases des fonctions, découvrons les concepts avancés qui vous permettront d’écrire du code plus élégant et réutilisable.
Paramètres par défaut#
Syntaxe de base#
def saluer(nom, message="Bonjour"): return f"{message}, {nom}!"
# Utilisation avec paramètre par défautprint(saluer("Alice")) # "Bonjour, Alice!"
# Utilisation avec paramètre personnaliséprint(saluer("Bob", "Salut")) # "Salut, Bob!"Paramètres par défaut multiples#
def creer_profil(nom, age=25, ville="Paris", actif=True): return { "nom": nom, "age": age, "ville": ville, "actif": actif }
# Utilisation avec différents paramètresprofil1 = creer_profil("Alice")profil2 = creer_profil("Bob", 30)profil3 = creer_profil("Charlie", ville="Lyon")Arguments nommés et positionnels#
Python permet de passer les arguments par position ou par nom.
Arguments positionnels#
def calculer_prix(prix_base, tva=0.2, remise=0): prix_final = prix_base * (1 + tva) * (1 - remise) return prix_final
# Arguments par positionprix1 = calculer_prix(100, 0.1, 0.05)Arguments nommés#
# Arguments par nom (plus lisible)prix2 = calculer_prix( prix_base=100, remise=0.1, tva=0.2)Fonctions avec un nombre variable d’arguments#
*args (arguments positionnels variables)#
def additionner(*nombres): total = 0 for nombre in nombres: total += nombre return total
# Utilisationresultat1 = additionner(1, 2, 3) # 6resultat2 = additionner(1, 2, 3, 4, 5) # 15**kwargs (arguments nommés variables)#
def creer_configuration(**options): config = { "debug": False, "timeout": 30, "retry": 3 } config.update(options) return config
# Utilisationconfig1 = creer_configuration(debug=True)config2 = creer_configuration(timeout=60, retry=5)Combinaison *args et **kwargs#
def fonction_complete(*args, **kwargs): print("Arguments positionnels:", args) print("Arguments nommés:", kwargs)
fonction_complete(1, 2, 3, nom="Alice", age=25)Fonctions lambda (fonctions anonymes)#
Syntaxe de base#
# Fonction normaledef carre(x): return x ** 2
# Fonction lambda équivalentecarre_lambda = lambda x: x ** 2
print(carre(5)) # 25print(carre_lambda(5)) # 25Utilisation avec les fonctions intégrées#
```python title=“Lambda avec map(), filter() et sorted()” showLineNumbers
nombres = [1, 2, 3, 4, 5]
carres = list(map(lambda x: x ** 2, nombres)) print(carres) # [1, 4, 9, 16, 25]
pairs = list(filter(lambda x: x % 2 == 0, nombres)) print(pairs) # [2, 4]
noms = [“Alice”, “Bob”, “Charlie”] noms_tries = sorted(noms, key=lambda nom: len(nom)) print(noms_tries) # [“Bob”, “Alice”, “Charlie”]
<Callout variant="tip">Les fonctions lambda sont idéales pour des opérations simples. Pour des logiques plus complexes, préférez les fonctions normales avec `python:def` qui sont plus lisibles et peuvent contenir plusieurs instructions.</Callout>
## Fonctions comme objets de première classe
En Python, les fonctions sont des objets comme les autres.
### Assignation de fonctions
```python title="Assignation et manipulation de fonctions" showLineNumbersdef dire_bonjour(): return "Bonjour!"
def dire_aurevoir(): return "Au revoir!"
# Assignation de fonctionsalutation = dire_bonjourprint(salutation()) # "Bonjour!"
salutation = dire_aurevoirprint(salutation()) # "Au revoir!"Fonctions comme paramètres#
def appliquer_operation(nombres, operation): resultats = [] for nombre in nombres: resultats.append(operation(nombre)) return resultats
def doubler(x): return x * 2
def tripler(x): return x * 3
nombres = [1, 2, 3, 4, 5]
# Utilisationdoubles = appliquer_operation(nombres, doubler)triples = appliquer_operation(nombres, tripler)
print(doubles) # [2, 4, 6, 8, 10]print(triples) # [3, 6, 9, 12, 15]Fonctions imbriquées et closures#
Fonctions imbriquées#
def calculatrice(): def addition(a, b): return a + b
def soustraction(a, b): return a - b
def multiplication(a, b): return a * b
return { "add": addition, "sub": soustraction, "mul": multiplication }
# Utilisationcalc = calculatrice()resultat = calc["add"](5, 3) # 8Closures (fermetures)#
def creer_multiplicateur(facteur): def multiplier(nombre): return nombre * facteur return multiplier
# Création de fonctions spécialiséesmultiplier_par_2 = creer_multiplicateur(2)multiplier_par_3 = creer_multiplicateur(3)
print(multiplier_par_2(5)) # 10print(multiplier_par_3(5)) # 15Décorateurs (introduction)#
Décorateur simple#
def chronometrer(fonction): def wrapper(*args, **kwargs): import time debut = time.time() resultat = fonction(*args, **kwargs) fin = time.time() print(f"Temps d'exécution: {fin - debut:.2f} secondes") return resultat return wrapper
@chronometrerdef calcul_long(): total = 0 for i in range(1000000): total += i return total
resultat = calcul_long()Récursion#
Exemple classique : factorielle#
def factorielle(n): if n <= 1: return 1 else: return n * factorielle(n - 1)
print(factorielle(5)) # 120Exemple : suite de Fibonacci#
def fibonacci(n): if n <= 1: return n else: return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10)) # 55Récursion avec mémorisation#
def fibonacci_memo(n, memo={}): if n in memo: return memo[n] if n <= 1: return n memo[n] = fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo) return memo[n]
print(fibonacci_memo(50)) # Beaucoup plus rapide !Bonnes pratiques#
Documentation des fonctions#
def calculer_moyenne(nombres): """ Calcule la moyenne d'une liste de nombres.
Args: nombres (list): Liste de nombres à moyenner
Returns: float: La moyenne des nombres
Raises: ValueError: Si la liste est vide """ if not nombres: raise ValueError("La liste ne peut pas être vide")
return sum(nombres) / len(nombres)Gestion des erreurs#
def diviser(a, b): try: return a / b except ZeroDivisionError: print("Erreur: Division par zéro") return None except TypeError: print("Erreur: Types invalides") return NoneExercices pratiques#
Conclusion#
Les fonctions avancées en Python offrent une grande flexibilité :
- Paramètres par défaut : Pour des fonctions plus pratiques
- Arguments variables (
*args,**kwargs) : Pour une adaptabilité maximale - Fonctions
lambda: Pour des opérations simples et élégantes - Closures : Pour créer des fonctions spécialisées
- Récursion : Pour résoudre des problèmes complexes
Maîtrisez ces concepts et vous écrirez du code Python plus professionnel et maintenable !