Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

*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