Python bietet eine Möglichkeit, Funktionen so zu gestalten, dass sie eine beliebige Anzahl von Argumenten akzeptieren, indem spezielle Symbole verwendet werden. Diese Symbole sind * und **, die vor Variablennamen gesetzt werden, um *args bzw. **kwargs zu kennzeichnen. Du kannst den Parametern *args oder **kwargs beliebige Namen geben, aber der Konvention folgend werden sie als args (Argumente) und kwargs (Keyword-Argumente) bezeichnet.
Mit *args kannst du eine beliebige Anzahl von Argumenten ohne Schlüsselwörter an eine Funktion übergeben. Hier ein Beispiel:
def add(*args):
res = 0 # Initialisiere das Endergebnis mit 0
for num in args: # Iteriere über die Liste der übergebenen Argumente
res += num # Addiere jede Zahl zur Summe hinzu
return res
print(add(3, 5, 7, 9)) # 24
In diesem Programm ist args ein Tupel mit den Werten, die wir an die Funktion übergeben. Im obigen Beispiel entspricht args(3, 5, 7, 9). So können wir unserer Funktion beliebig viele Argumente übergeben.
**kwargs
Mit **kwargs kannst du eine beliebige Anzahl von Argumenten mit Schlüsselwörtern an eine Funktion übergeben. Anders ausgedrückt: Wir verwenden **kwargs, um beliebig viele Keyword-Argumente an unsere Funktion zu übergeben. Hier ein Beispiel:
def introduce(**kwargs):
for key, value in kwargs.items(): # Iteriere über alle Schlüssel-Wert-Paare
print(f'{key}: {value}') # Gib jedes Schlüssel-Wert-Paar aus
introduce(Name='Alice', Age=25, Country='USA')
# 'Name: Alice'
# 'Age: 25'
# 'Country: USA'
In dem obigen Programm ist kwargs ein Wörterbuch mit den Schlüssel-Wert-Paaren, die wir an die Funktion übergeben. Im Beispiel entspricht kwargs{'Name': 'Alice', 'Age': 25, 'Country': 'USA'}.
Du kannst *args und **kwargs auch in einem Funktionsaufruf kombinieren. Dabei muss *args vor **kwargs stehen.
def combined_example(*args, **kwargs):
print(args) # Gibt das Tupel der Argumente aus
print(kwargs) # Gibt das Wörterbuch der Keyword-Argumente aus
combined_example(1, 2, 3, Name='Alice', Age=25)
# (1, 2, 3)
# {'Name': 'Alice', 'Age': 25}
In dieser Funktion ist args ein Tupel mit den Werten (1, 2, 3), und kwargs ist ein Wörterbuch mit den Werten {'Name': 'Alice', 'Age': 25}.
Diese Flexibilität, beliebig viele Argumente und Keyword-Argumente zu verarbeiten, kann sehr nützlich sein, wenn du deine Funktionen dynamischer und vielseitiger gestalten möchtest.
Kombination von *args und **kwargs mit regulären Funktionsargumenten
*args und **kwargs können in Kombination mit regulären Funktionsargumenten verwendet werden. In diesen Fällen musst du einige Regeln beachten:
Die korrekte Reihenfolge der Argumente in der Funktionsdefinition sollte sein: Standardargumente, *args, dann **kwargs.
Standardargumente (auch Positionsargumente genannt) müssen immer vor *args und **kwargs angegeben werden.
def function_example(a, b, *args, **kwargs):
print(a) # Gibt das erste Standardargument aus
print(b) # Gibt das zweite Standardargument aus
print(args) # Gibt zusätzliche nicht benannte Argumente aus
print(kwargs) # Gibt Keyword-Argumente aus
function_example(1, 2, 3, 4, 5, Name='Alice', Age=25)
# 1
# 2
# (3, 4, 5)
# {'Name': 'Alice', 'Age': 25}
Hier entsprechen 1 und 2 den Standardargumenten a und b in der Funktionsdefinition. Das Tupel (3, 4, 5) repräsentiert zusätzliche Argumente, die in args gesammelt werden. Die verbleibenden Keyword-Argumente werden in kwargs als Wörterbuch gesammelt.
Wenn du *args und **kwargs mit Standardargumenten verwenden möchtest, achte darauf, die Standardargumente beim Funktionsaufruf nicht zu vergessen, da dies zu einem TypeError führen würde. Beispielsweise würde der Aufruf von function_example(1, Name='Alice', Age=25) ohne Angabe eines Wertes für das Argument b einen Fehler verursachen.