dans cette leçon, vous allez apprendre à définir différents types de paramètres pour vos fonctions, à les appeler correctement et à gérer un nombre variable d’arguments.
objectifs
- utiliser des paramètres positionnels et nommés
- définir des valeurs par défaut
- accepter un nombre variable d’arguments avec
*argset**kwargs - connaître les règles d’ordre des paramètres
- éviter les pièges avec les valeurs par défaut mutables
paramètres positionnels et nommés
par défaut, les arguments sont passés par position :
def rectangle(l, h):
return l * h
print(rectangle(3, 4))
vous pouvez aussi les passer par nom :
print(rectangle(h=4, l=3))
valeurs par défaut
def saluer(nom="inconnu"):
print(f"bonjour {nom}")
saluer("ana")
saluer()
⚠ les valeurs par défaut sont évaluées une seule fois à la définition :
def ajouter(val, liste=[]):
liste.append(val)
return liste
print(ajouter(1)) # [1]
print(ajouter(2)) # [1, 2] (piège !)
utilisez plutôt :
def ajouter(val, liste=None):
if liste is None:
liste = []
liste.append(val)
return liste
nombre variable d’arguments : *args
*args capture les arguments positionnels supplémentaires sous forme de tuple.
def somme(*args):
return sum(args)
print(somme(1, 2, 3))
arguments nommés variables : **kwargs
**kwargs capture les arguments nommés supplémentaires sous forme de dictionnaire.
def afficher_infos(**kwargs):
for k, v in kwargs.items():
print(k, "=", v)
afficher_infos(nom="ana", age=30)
combiner différents types de paramètres
ordre recommandé :
- paramètres positionnels obligatoires
- *args
- paramètres nommés avec valeurs par défaut
- **kwargs
def demo(a, b, *args, opt=0, **kwargs):
print(a, b, args, opt, kwargs)
demo(1, 2, 3, 4, opt=99, extra="oui")
déballage d’arguments
* et ** peuvent aussi déballer des séquences/dicos à l’appel :
nums = (3, 5)
print(rectangle(*nums)) # équivaut à rectangle(3, 5)
params = {"l": 2, "h": 6}
print(rectangle(**params))
bonnes pratiques
- noms explicites pour les paramètres
- valeurs par défaut immuables (
None, nombres, chaînes, tuples) - ne pas abuser de
*argset**kwargsdans du code simple - documenter l’usage des arguments variables
mini exemples exécutables
# fonction avec *args et **kwargs
def rapport(titre, *lignes, **options):
print(f"== {titre} ==")
for l in lignes:
print("-", l)
if options.get("footer"):
print(f"-- {options['footer']} --")
rapport("courses", "pommes", "lait", footer="fin")
# fonction de mise en forme
def format_coord(x, y, sep=","):
return f"{x}{sep}{y}"
print(format_coord(10, 20))
print(format_coord(10, 20, sep=";"))
# safe append
def safe_append(item, lst=None):
if lst is None:
lst = []
lst.append(item)
return lst
print(safe_append(1))
print(safe_append(2))
pièges courants
- valeurs par défaut mutables → effets de bord
- arguments nommés mal orthographiés → ignorés sauf si capturés par
**kwargs - mauvaise position des paramètres →
SyntaxError - déballage
*seqqui ne correspond pas au nombre attendu de paramètres
exercices
moyenne(*nombres)→ retourne la moyenne ouNonesi aucun nombre.tag(content, **attrs)→ retourne une chaîne HTML avec attributs (tag("ok", id="t1", class_="rouge")).distance(x1, y1, x2, y2, *, unite="m")→ calcule la distance euclidienne et ajoute l’unité.- réécrire
max()maison avec*args(ignore vide → retourneNone). - fonction
fusion(*listes)→ fusionne plusieurs listes en une seule sans doublons.