Passer au contenu principal
eLearner.app
Module 5 · Leçon 3 sur 419/36 dans le cours~12 min
Leçons du module (3/4)

*args et **kwargs

Parfois, vous souhaitez qu'une fonction accepte un nombre variable d'arguments. Python vous propose deux outils : *args (rassemble les arguments positionnels dans un tuple) et **kwargs (rassemble les arguments nommés dans un dictionnaire).

*args : arguments positionnels variables

Python
def somma_tutto(*nums):
    totale = 0
    for n in nums:
        totale += n
    return totale

somma_tutto(1, 2, 3)         # 6
somma_tutto(1, 2, 3, 4, 5)   # 15
somma_tutto()                # 0

À l'intérieur de la fonction, nums est un tuple contenant toutes les valeurs passées. Le nom est juste une convention : *args est le plus courant, mais *nums ou *valori sont parfaitement valides.

**kwargs : arguments nommés variables

Python
def crea_config(**opzioni):
    return opzioni

crea_config(debug=True, port=8080)
# {'debug': True, 'port': 8080}

À l'intérieur de la fonction, opzioni est un dictionnaire contenant {param_name: value}.

Combiner le tout

L'ordre fixe est : **paramètres réguliers, *args, paramètres par défaut, **kwargs**.

Python
def f(primo, *args, opzione="x", **kwargs):
    print(primo, args, opzione, kwargs)

f(1, 2, 3, opzione="y", extra=10)
# 1 (2, 3) y {'extra': 10}

Déballage lors de l'appel : * et **

Le même opérateur fonctionne dans l'autre sens : pour "faire exploser" une liste/tuple en arguments positionnels ou un dictionnaire en arguments nommés.

Python
def punto(x, y, z):
    return (x, y, z)

coords = [1, 2, 3]
punto(*coords)        # punto(1, 2, 3)  →  (1, 2, 3)

opts = {"x": 1, "y": 2, "z": 3}
punto(**opts)         # punto(x=1, y=2, z=3)

Modèle de wrapper

Python
def log_chiamata(fn, *args, **kwargs):
    print(f"chiamo {fn.__name__} con {args=} {kwargs=}")
    return fn(*args, **kwargs)

log_chiamata(max, 3, 1, 2)             # calls max(3, 1, 2)
log_chiamata(sorted, [3, 1, 2], reverse=True)

Ordre des paramètres dans les signatures de fonctions

Lors de la définition d'une fonction qui accepte plusieurs types d'arguments, vous devez respecter un ordre strict dans la signature :

  1. Paramètres positionnels standard.
  2. Varargs positionnels *args.
  3. Paramètres nommés avec valeurs par défaut.
  4. Varargs nommés **kwargs.

À vous de jouer

Exercice#python.m5.l3.e1
Tentatives : 0Chargement…

Définissez `average(*nums)` qui renvoie la moyenne arithmétique (somme / nombre). Appelez-la avec 10, 20, 30 et assignez le résultat à `m`. Évaluez `m`.

Chargement de l'éditeur…
Afficher l'indice

sum(nums) / len(nums)

Solution disponible après 3 tentatives

Exercice de révision

Exercice#python.m5.l3.e2
Tentatives : 0Chargement…

Étant donné la fonction `def point(x, y, z): return x + y + z` et le dictionnaire `coords = {'x': 1, 'y': 2, 'z': 3}`, appelez point en déballant coords et attribuez le résultat à `s`. Évaluez `s`.

Chargement de l'éditeur…
Afficher l'indice

point(**coords)

Solution disponible après 3 tentatives

Défi supplémentaire

Exercice#python.m5.l3.e3
Tentatives : 0Chargement…

Écrivez une fonction `multiply_all(*args)` qui renvoie le produit de tous les nombres passés en arguments. Si aucun argument n'est passé, elle doit renvoyer `1`. Enfin, évaluez l'appel `multiply_all(2, 3, 4)`.

Chargement de l'éditeur…
Afficher l'indice

Utilisez une boucle for pour itérer sur les éléments de args et accumuler leur produit.

Solution disponible après 3 tentatives