Retour au cours

fonctions : paramètres positionnels, nommés, valeurs par défaut, *args et **kwargs

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 *args et **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é :

  1. paramètres positionnels obligatoires
  2. *args
  3. paramètres nommés avec valeurs par défaut
  4. **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 *args et **kwargs dans 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 *seq qui ne correspond pas au nombre attendu de paramètres

exercices

  1. moyenne(*nombres) → retourne la moyenne ou None si aucun nombre.
  2. tag(content, **attrs) → retourne une chaîne HTML avec attributs (tag("ok", id="t1", class_="rouge")).
  3. distance(x1, y1, x2, y2, *, unite="m") → calcule la distance euclidienne et ajoute l’unité.
  4. réécrire max() maison avec *args (ignore vide → retourne None).
  5. fonction fusion(*listes) → fusionne plusieurs listes en une seule sans doublons.