Funktionen mit variabler Parameteranzahl
Bisher sind wir bei der Übergabe der Parameter immer davon ausgegangen, dass wir die Anzahl der Parameter kennen.
def ausgabe(wert1, wert2):
print("Ausgabe von Text aus einer Funktion")
print(wert1)
print(wert2)
ausgabe(5,3)
Was passiert aber, wenn wir die Anzahl der Parameter nicht kennen? Wenn also eine variable Parameteranzahl vorliegt? Auch für diesen Fall hat und Python eine Lösung. Wir kennzeichnen unseren Parameternamen mit einem Stern am Anfang.
def ausgabe( *mehrereParameter ):
for einzelwert in mehrereParameter:
print(einzelwert)
ausgabe("Hallo", "Welt", "guten", "Morgen")
Jetzt können wir beliebig viele Parameter übergeben. Die Ausgabe des Beispielcodes ergibt:
Hallo
Welt
guten
Morgen
Jeder einzelne Parameter wird über die print
-Ausgabe in einer eigenen Zeile ausgegeben.
Allerdings funktioniert eine Vorbelegung eines einzelnen Parameters nicht mehr, wie wir es bereits kennengelernt haben:
def ausgabe(wert1="Hallo", wert2="Welt"):
print("Ausgabe von Text aus einer Funktion")
print(wert1)
print(wert2)
ausgabe(5,3)
Wir haben bei Funktionen mit variabler Parameteranzahl auch keinen einzelnen Parameter – die folgende Konstruktion führt zu der Fehlermeldung "SyntaxError: invalid syntax".
def ausgabe( *mehrereParameter="falsch!" ):
Und das gute ist – wir benötigen es in diesem Fall auch nicht wirklich. Wir können beliebig viele Parameter übergeben. Und dabei meint mit "beliebig viele" auch keinen Inhalt. Folgender Code wird ohne Fehlermeldung korrekt abgearbeitet – es erfolgt auch keine Ausgabe, denn wir haben auch keinen Inhalt unserem Parameter "*mehrereParameter" übergeben:
def ausgabe( *mehrereParameter ):
for einzelwert in mehrereParameter:
print(einzelwert)
ausgabe()
Vorsicht bei der Verwendung! Hier wird eine spätere Fehlersuche aufwendiger – besonders bei Logikfehlern.
*args and **kwargs – Konventionen unter Programmierer
Bei der eingeführten variablen Parameteranzahl haben wir oben im Beispiel die Bezeichnung *mehrereParameter
verwendet. Das funktioniert auch wunderbar. Wer diesen Bereich von Python kennt, wundert sich vielleicht über die gewählte Bezeichnung. Viele Tutorials verwenden hier die Bezeichnung *args
und **kwargs
. Wichtig sind nur die Sternchenoperatoren am Anfang – die Bezeichnung danach kann beliebig gesetzt werden! Die nach Konvention benutzte Bezeichnung *args
steht einfach für das englische „arguments“. Somit haben wir die Wortherkunft. Für den Einsteiger ist es meiner Erfahrung nach klarer, wenn man erst einmal *mehrereParameter
verwendet.
Unterschied zwischen *args and **kwargs
Bei der Verwendung von **kwargs spielen Dictionary die Hauptrolle. Wir verwenden für die Parameterübergabe also Key-Value Paare.
def uebergeben(**kwargs):
for key, value in kwargs.items():
print("{0} = {1}".format(key, value))
uebergeben(vorname="Axel")
Als Ergebnis erhalten wir:
vorname = Axel
Und was ist die Herkunft der Bezeichnung **kwargs? Diese kommt aus Englischen keywordarguments.
In der deutschen Schreibweise müsste dann unser **kwargs
dann etwas mit *mehrereWoerterbuchParameter
sich nennen. Kann man machen, muss man aber nicht. Wie gesagt: Es sind primär die zwei Sternchenoperatoren am Anfang wichtig – alles danach kann nach Belieben benannt werden.
Reihenfolge, wenn alle 3 Arten von Übergaben verwendet werden
Wenn wir in unserem Programm nun alle 3 Arten von Übergaben verwenden wollen, dann muss die Reihenfolge eingehalten werden:
eineFunktion(Argument1, *args, **kwargs)