*args und **kwargs
Neber den ganz normalen Funktionsparameter, die wir bis jetzt gelernt haben, gibt es auch noch ganz besondere Funktionsparameter, die wir in diesen Kapitel uns mal genauer anschauen werden.
Programmieren wir mal eine einfache sum
Funktion,
die mehrere Zahlen miteinander addiert.
def sum(a, b):
return a + b
Wenn wir jetzt aber drei oder mehr Zahlen miteinander addieren wollen, dann müssen wir eben genau so viele Parameter der Funktionsdefinition hinzufügen wie die Anzahl der Zahlen, die wir addieren wollen.
def sum(a, b, c, d):
return a + b + c + d
Jetzt haben wir nur ein Problem... Was wenn ich nur zwei Zahlen miteinander addieren möchte? Dann kann ich entweder eine neue Funktion definieren oder ich gebe jedem Parameter einen Defaultwert von 0.
def sum(a, b, c = 0, d = 0):
return a + b + c + d
Das funktioniert zwar wunderbar, aber das ist nicht sehr elegant... Wir können Python sagen, dass er alle Parameter in einer Liste zusammenfassen soll.
def sum(*args):
res = 0
for arg in args:
res += arg
return res
sum(5, 15, 4)
24
*args
ist eine Liste von allen Parametern,
wie du am Output von sum(5, 15, 4)
erkennen kannst.
Dabei ist args
der Name des Listenparameters.
Der Name ist aber egal.
Wir hätten es auch numbers
nennen können.
Das *
ist entscheident hier,
um zwischen einen normalen Parametern und Listenparametern zu unterscheiden.
Wir können aber auch normale Parameter mit den *
Parameter gleichzeitig verwenden.
def sum(a, b, *args)
res = a + b
for arg in args:
res += arg
return res
**kwargs
Nebe einem *
Parameter gibt es auch noch einen **
Parameter,
der ein Dictionary aus allen benannten Parameter macht ("named parameters" auf Englisch).
Hier zum Beispiel eine shopping_list
Funktion,
die alle benannte Parameter und ihren Wert in die Konsole ausgibt.
def shopping_list(**kwargs):
for keyword, arg in kwargs.items():
print(keyword, ":", arg, "mal")
shopping_list(tomaten = 5, zwiebel = 3, milch = 1, kichererbsen = 1)
tomaten : 5 mal
zwiebel : 3 mal
milch : 1 mal
kichererbsen : 1 mal
Hier nich eine simple Funktion mit allen drei Funktionsparametertypen kombiniert.
def my_func(normal_arg, *args, **kwargs):
print("Stinknormaler Funktionsparameter:", normal_arg)
for arg in args:
print("Funktionsparameter als Liste:", arg)
for keyword, arg in kwargs.items():
print("Funktionsparameter als Dictionary:", keyword, arg)
my_func("normal", 1, 2, 3, name = "Marc", greeting = "Hi")
Stinknormaler Funktionsparameter: normal
Funktionsparameter als Liste: 1
Funktionsparameter als Liste: 2
Funktionsparameter als Liste: 3
Funktionsparameter als Dictionary: name Marc
Funktionsparameter als Dictionary: greeting Hi