Was sind * args und ** kwargs in Python?

Funktionen sind Leben. Richtig? Wenn Sie gerade mit dem Erlernen von Python begonnen haben, spielt es keine Rolle, ob es Ihre erste Programmiersprache ist oder ob Sie aus einer anderen Sprache zu Python gekommen sind, dann wissen Sie bereits, dass die Anzahl der Parameter in der Funktionsdeklaration der Anzahl der Argumente entspricht, die die Funktion beim Aufruf übergibt.



Das sind die Grundlagen. Dies hilft den Menschen, die Welt um sie herum zu verstehen. Die Aussage "Die Anzahl der Parameter ist gleich der Anzahl der Argumente" setzt dem Anfänger eine Zeitbombe in den Kopf, die **kwargs wird, nachdem er die mysteriösen *args oder **kwargs Konstrukte in der Funktionsdeklaration gesehen hat.

Lassen Sie sich nicht von einem Abzeichen in einen Stupor treiben. Hier gibt es nichts Archaisches. Wenn Ihnen diese Entwürfe nicht bekannt sind, empfehle ich Ihnen, sich mit ihnen zu befassen.

Positions- und benannte Argumente


Um mit *args und **kwargs , müssen wir die Konzepte von positionellen und benannten Argumenten beherrschen.

Sprechen wir zunächst darüber, wie unterschiedlich sie sind. In der einfachsten Funktion ordnen wir einfach die Positionen der Argumente und Parameter zu. Argument Nr. 1 entspricht Parameter Nr. 1, Argument Nr. 2 entspricht Parameter Nr. 2 usw.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2,3) """ 1 is stored in a 2 is stored in b 3 is stored in c """ 

Um eine Funktion aufzurufen, sind alle drei Argumente erforderlich. Wenn Sie mindestens eine davon überspringen, wird eine Fehlermeldung angezeigt.

 def printThese(a,b,c):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ TypeError: printThese() missing 1 required positional argument: 'c' """ 

Wenn Sie dem Parameter beim Deklarieren einer Funktion einen Standardwert zuweisen, muss beim Aufruf der Funktion nicht mehr das entsprechende Argument angegeben werden. Der Parameter wird optional.

 def printThese(a,b,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(1,2) """ 1 is stored in a 2 is stored in b None is stored in c """ 

Optionale Parameter können auch festgelegt werden, wenn eine Funktion mit ihrem Namen aufgerufen wird.

Im folgenden Beispiel setzen wir die drei Parameter auf den Standardwert None und untersuchen, wie sie mit ihren Namen zugewiesen werden können und achten nicht auf die Reihenfolge der Argumente, die beim Aufrufen der Funktion verwendet werden.

 def printThese(a=None,b=None,c=None):   print(a, "is stored in a")   print(b, "is stored in b")   print(c, "is stored in c") printThese(c=3, a=1) """ 1 is stored in a None is stored in b 3 is stored in c """ 

Asterisk-Operator


Der Operator * wird am häufigsten mit der Operation der Multiplikation in Menschen assoziiert, aber in Python hat er eine andere Bedeutung.

Mit diesem Operator können Sie Objekte „entpacken“, in denen bestimmte Elemente gespeichert sind. Hier ist ein Beispiel:

 a = [1,2,3] b = [*a,4,5,6] print(b) # [1,2,3,4,5,6] 

Hier wird der Inhalt von Liste a entnommen, entpackt und auf Liste b abgelegt.

Wie man * args und ** kwargs benutzt


Wir wissen also, dass der "Sternchen" -Operator in Python in der Lage ist, ihre konstituierenden Elemente aus Objekten "herauszuholen". Wir wissen auch, dass es zwei Arten von Parameterfunktionen gibt. Möglicherweise haben Sie bereits selbst darüber nachgedacht, aber für den Fall werde ich dies sagen. *args ist eine Abkürzung für "Argumente" (arguments) und ** kwargs ist eine Abkürzung für "keyword arguments" (named arguments).

Jedes dieser Konstrukte wird zum Entpacken von Argumenten des entsprechenden Typs verwendet, sodass Sie Funktionen mit einer Liste von Argumenten variabler Länge aufrufen können. Beispiel: Erstellen Sie eine Funktion, mit der die von einem Schüler in einem Test eingegebenen Ergebnisse angezeigt werden können:

 def printScores(student, *scores):   print(f"Student Name: {student}")   for score in scores:      print(score) printScores("Jonathan",100, 95, 88, 92, 99) """ Student Name: Jonathan 100 95 88 92 99 """ 

Ich habe beim Deklarieren einer Funktion nicht das Konstrukt *args verwendet. Stattdessen habe ich *scores . Gibt es hier einen Fehler? Hier liegt kein Fehler vor. Tatsache ist, dass "args" nur eine Reihe von Zeichen ist, die zur Bezeichnung von Argumenten verwendet werden. Das Wichtigste hier ist der Operator * . Und was genau danach kommt, spielt keine besondere Rolle. Mit * wir eine Liste von Positionsargumenten erstellt, die darauf basieren, was an die Funktion beim Aufruf übergeben wurde.

Nachdem wir *args , sollte es keine Probleme mehr mit dem Verstehen von **kwargs . Auch hier spielt der Name keine Rolle. Die Hauptsache sind zwei Zeichen ** . Dank ihnen wird ein Wörterbuch erstellt, das benannte Argumente enthält, die beim Aufruf an die Funktion übergeben werden.

 def printPetNames(owner, **pets):   print(f"Owner Name: {owner}")   for pet,name in pets.items():      print(f"{pet}: {name}") printPetNames("Jonathan", dog="Brock", fish=["Larry", "Curly", "Moe"], turtle="Shelldon") """ Owner Name: Jonathan dog: Brock fish: ['Larry', 'Curly', 'Moe'] turtle: Shelldon """ 

Zusammenfassung


Mit den folgenden Tipps können Sie häufige Probleme vermeiden, die beim Arbeiten mit Funktionen auftreten, und Ihr Wissen erweitern:

  • Verwenden Sie die Konstrukte common *args und **kwargs , um positionelle und benannte Argumente zu erfassen.
  • **kwarg s können nicht vor *args . In diesem Fall wird eine Fehlermeldung angezeigt.
  • **kwargs Sie auf Konflikte zwischen benannten Parametern und **kwargs , wenn der Wert als **kwarg Argument übergeben werden soll, der Schlüsselname dieses Werts jedoch mit dem Namen des benannten Parameters übereinstimmt.
  • Der Operator * kann nicht nur in Funktionsdeklarationen verwendet werden, sondern auch, wenn sie aufgerufen werden.

Sehr geehrte Leser! Welche Parameter verwenden Sie am häufigsten, wenn Sie Python-Funktionen deklarieren?

Source: https://habr.com/ru/post/de482464/


All Articles