Direkt zum Hauptinhalt springen
eLearner.app
Modul 5 · Lektion 3 von 419/36 im Kurs~12 min
Lektionen des Moduls (3/4)

*args und **kwargs

Manchmal möchtest du eine Funktion haben, die eine variable Anzahl von Argumenten akzeptiert. Python bietet dir zwei Werkzeuge: *args (sammelt positionelle Argumente in einem Tupel) und **kwargs (sammelt Schlüsselwortargumente in einem Dictionary).

*args: Variable positionelle Argumente

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

Innerhalb der Funktion ist nums ein Tupel mit allen übergebenen Werten. Der Name ist nur eine Konvention: *args ist am gebräuchlichsten, aber *nums oder *valori sind absolut gültig.

**kwargs: Variable Schlüsselwortargumente

Python
def crea_config(**opzioni):
    return opzioni

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

Innerhalb der Funktion ist opzioni ein Dictionary mit {param_name: value}.

Alles kombinieren

Die feste Reihenfolge lautet: **reguläre Parameter, *args, Standardparameter, **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}

Entpacken im Aufruf: * und **

Derselbe Operator funktioniert auch umgekehrt: Um eine Liste/ein Tupel in positionelle Argumente oder ein Dictionary in Schlüsselwortargumente zu "entpacken".

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)

Wrapper-Muster

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)

Parameterreihenfolge in Funktionssignaturen

Wenn du eine Funktion definierst, die mehrere Argumenttypen akzeptiert, musst du eine strikte Reihenfolge in der Signatur einhalten:

  1. Standard-Positionsparameter.
  2. Positionelle Varargs *args.
  3. Schlüsselwortparameter mit Standardwerten.
  4. Schlüsselwort-Varargs **kwargs.

Probiere es aus

Übung#python.m5.l3.e1
Versuche: 0Wird geladen…

Definiere `average(*nums)`, das das arithmetische Mittel (Summe / Anzahl) zurückgibt. Rufe es mit 10, 20, 30 auf und weise das Ergebnis `m` zu. Evaluiere `m`.

Editor wird geladen…
Hinweis anzeigen

sum(nums) / len(nums)

Lösung nach 3 Versuchen verfügbar

Wiederholungsübung

Übung#python.m5.l3.e2
Versuche: 0Wird geladen…

Gegeben sei die Funktion `def point(x, y, z): return x + y + z` und das Dictionary `coords = {'x': 1, 'y': 2, 'z': 3}`. Rufe point auf, entpacke coords und weise das Ergebnis `s` zu. Evaluiere `s`.

Editor wird geladen…
Hinweis anzeigen

point(**coords)

Lösung nach 3 Versuchen verfügbar

Zusätzliche Herausforderung

Übung#python.m5.l3.e3
Versuche: 0Wird geladen…

Schreibe eine Funktion `multiply_all(*args)`, die das Produkt aller als Argumente übergebenen Zahlen zurückgibt. Wenn keine Argumente übergeben werden, sollte sie `1` zurückgeben. Evaluiere schließlich den Aufruf `multiply_all(2, 3, 4)`.

Editor wird geladen…
Hinweis anzeigen

Verwende eine for-Schleife, um über die Elemente in args zu iterieren und ihr Produkt zu akkumulieren.

Lösung nach 3 Versuchen verfügbar