Direct naar de hoofdinhoud
Module 5 · Les 3 van 419/36 in de cursus~12 min
Modulelessen (3/4)

*args en **kwargs

Soms wilt u een functie die een variabel aantal accepteert argumenten. Python geeft je twee tools: *args (verzamelt positionele argumenten in een tupel) en **kwargs (verzamelt trefwoordargumenten in een dictaat).

*args: variabele positionele argumenten

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

Binnen de functie is nums een tuple waarbij alle waarden zijn doorgegeven. De naam is slechts een conventie: *args is de meest voorkomende, maar *nums of *valori zijn volkomen geldig.

**kwargs: variabele trefwoordargumenten

Python
def crea_config(**opzioni):
    return opzioni

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

Binnen de functie is opzioni een dict met {param_name: value}.

Alles combineren

De vaste volgorde is: **reguliere parameters, *args, standaardparameters, **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}

Uitpakken tijdens de oproep: * en **

Dezelfde operator werkt andersom: een lijst/tupel "exploderen". in positionele argumenten of een dictaat in trefwoordargumenten.

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)

Wikkelpatroon

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)

Parametervolgorde in functiehandtekeningen

Wanneer u een functie definieert die meerdere argumenttypen accepteert, moet u zich aan een strikte volgorde in de handtekening houden:

  1. Standaard positionele parameters.
  2. Positionele varargs *args.
  3. Trefwoordparameters met standaardwaarden.
  4. Trefwoordvarargs **kwargs.

Probeer het

Oefening#python.m5.l3.e1
Pogingen: 0Laden…

Definieer 'gemiddelde(*nums)' dat het rekenkundig gemiddelde retourneert (som/aantal). Noem het met 10, 20, 30 en wijs het resultaat toe aan `m`. Evalueer `m`.

Editor laden…
Toon hint

som(nums) / len(nums)

Oplossing beschikbaar na 3 pogingen

Oefening beoordelen

Oefening#python.m5.l3.e2
Pogingen: 0Laden…

Gegeven de functie `def point(x, y, z): return x + y + z` en het dictaat `coords = {'x': 1, 'y': 2, 'z': 3}`, roep het uitpakpunt op en wijs het resultaat toe aan `s`. Evalueer `s`.

Editor laden…
Toon hint

punt(**coördinaten)

Oplossing beschikbaar na 3 pogingen

Extra uitdaging

Oefening#python.m5.l3.e3
Pogingen: 0Laden…

Write a function `multiply_all(*args)` that returns the product of all numbers passed as arguments. If no arguments are passed, it should return `1`. Finally, evaluate the call `multiply_all(2, 3, 4)`.

Editor laden…
Toon hint

Gebruik een for-lus om de elementen in args te herhalen en hun product te verzamelen.

Oplossing beschikbaar na 3 pogingen