-
PYTHON > les fonctions
def nomFonction (paramètres) : #Bloc d'instructions
toute fonction doit renvoyer un résultat
valeurs par défaut
def additionne (x=1,y=2): return x+y additione(3) 5 additionne(y=3) 4
Cette syntaxe permet de changer l’ordre d’apparition des paramètres.
*args et **kwargs
*argspour des arguments positionnels et**kwargspour des arguments nommés*args
*args renvoie des tuples.
def args_example(*args): print(args) args_example(1) (1,) args_example(1,2,3,4,5) (1, 2, 3, 4, 5)
**kwargs
**kwargscapture tous les arguments nommés passés à la fonction sous forme d’un dictionnaire.def infos(**kwargs): for cle, valeur in kwargs.items(): print(cle + ': ' + valeur) infos(un='1') un: 1 infos(un='1', deux='2', trois='3') un: 1 deux: 2 trois: 3 infos(nom="toto", age=30, ville="Paris")
Combiner arguments positionnels (*args) et nommés (**kwargs)
def ma_fonction(arg1, *args, **kwargs): print(f"Argument positionnel : {arg1}") print(f"Arguments supplémentaires positionnels : {args}") print(f"Arguments nommés : {kwargs}") ma_fonction("Bonjour", 1, 2, 3, nom="Pierre", age=25)
3. Déballer un dictionnaire en arguments nommés
def configurer(base_url, timeout, headers): print(f"URL: {base_url}, Timeout: {timeout}, Headers: {headers}") params = { "base_url": "https://api.example.com", "timeout": 10, "headers": {"Content-Type": "application/json"} } configurer(**params) # Équivalent à configurer(base_url=..., timeout=..., headers=...)
URL: https://api.example.com, Timeout: 10, Headers: {‘Content-Type’: ‘application/json’}
4. Cas pratique : Fonction avec paramètres optionnels
def creer_utilisateur(nom, email, **options): utilisateur = { "nom": nom, "email": email, **options # Fusionne les options supplémentaires } return utilisateur # Appel avec des options supplémentaires user = creer_utilisateur( nom="Bob", email="bob@example.com", age=28, role="admin" )
Bonnes pratiques : Vérifiez les clés dans kwargs si nécessaire (ex: if ‘age’ not in kwargs: …).
Wrapper de fonction
def logger(fonction): def wrapper(*args, **kwargs): print(f"Appel de {fonction.__name__} avec args={args}, kwargs={kwargs}") return fonction(*args, **kwargs) return wrapper @logger def multiplier(x, y): return x * y multiplier(3, y=5) # Sortie : "Appel de multiplier avec args=(3,), kwargs={'y': 5}"
Résumé : Les arguments nommés (**kwargs) offrent une grande flexibilité pour créer des wrappers ou des décorateurs.
—