Was bedeutet ** (doppelter Stern/Sternchen) und * (Stern/asterisk) für Parameter?
In der folgenden Methode Definitionen, was bedeutet das *
und **
tun für param2
?
def foo(param1, *param2):
def bar(param1, **param2):
siehe auch stackoverflow.com/questions/6967632/...
Verwandte: Warum verpackt *args/**kwargs statt der übergabe-Liste/dict?
Weitere große Einsicht: stackoverflow.com/a/11315061/4561887
Siehe auch stackoverflow.com/questions/14301967/... für eine bare-Sternchen
Diese Frage ist eine sehr beliebte doppelte Ziel, aber leider wird es oft falsch verwendet. Beachten Sie, dass diese Frage fragt nach Definition von Funktionen mit varargs (
Verwandte: Warum verpackt *args/**kwargs statt der übergabe-Liste/dict?
Weitere große Einsicht: stackoverflow.com/a/11315061/4561887
Siehe auch stackoverflow.com/questions/14301967/... für eine bare-Sternchen
Diese Frage ist eine sehr beliebte doppelte Ziel, aber leider wird es oft falsch verwendet. Beachten Sie, dass diese Frage fragt nach Definition von Funktionen mit varargs (
def func(*args)
). Eine Frage zu Fragen, was es bedeutet, in der Funktion Anrufe (func(*[1,2])
) finden Sie unter hier. Für eine Frage: wie zu entpacken argument-Listen finden Sie unter hier. Eine Frage zu Fragen, was die *
bedeutet in Literale ([*[1, 2]]
) finden Sie unter hier.InformationsquelleAutor Todd | 2008-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
*args
und**kwargs
ist ein gemeinsames idiom zu erlauben beliebige Anzahl von Argumenten an Funktionen, wie beschrieben im Abschnitt mehr auf der Definition von Funktionen in der Python-Dokumentation.Den
*args
geben Sie alle Parameter der Funktion als ein Tupel:Den
**kwargs
geben Sie allekeyword-Argumente Ausnahme derjenigen, die entsprechenden formalen parameter als ein Wörterbuch.
Beide Idiome können gemischt werden, mit normalen Argumenten zu ermöglichen, eine Reihe von fixen und einen Variablen Argumente:
Andere Nutzung der
*l
idiom ist zu entpacken argument-Listen wenn Sie eine Funktion aufrufen.In Python 3 ist es möglich, verwenden Sie
*l
auf der linken Seite einer Zuweisung (Erweiterte Iterierbar Auspacken), aber es gibt eine Liste anstelle eines Tupels in diesem Zusammenhang:Auch Python 3 fügt neue semantische (siehe PEP 3102):
Solche Funktion akzeptiert nur 3 positionale Argumente, und alles nach
*
können nur übergeben werden, die als Schlüsselwort-Argumente.Python-dicts, semantisch verwendet für Schlüsselwort-argument übergeben, sind willkürlich angeordnet. Allerdings in Python-3.6, keyword-Argumente sind garantiert zu erinnern, insertion um. "Die Reihenfolge der Elemente in
**kwargs
entspricht jetzt der Reihenfolge, in der die Schlüsselwort-Argumente an die Funktion übergeben werden." - docs.python.org/3/whatsnew/3.6.html In der Tat, alle dicts in CPython 3.6 erinnern einlegen Ordnung, aber dies ist eine Implementierung detail, für jetzt, und die Nutzer sollten sich nicht darauf verlassen.Sehr präzise, sauber und leicht zu verstehen. Ich Schätze, dass Sie darauf hingewiesen, dass es ein "Auspacken " Betreiber", und so konnte ich unterscheiden von der übergabe by reference in C +1
Wie testet man die Letzte Funktion mit PEP 3102? Ich nenne es mit func(1,2,3,name="me",Alter=10) und es wirft Ausnahme:
got an unexpected keyword argument 'name'
Sie müssen übergeben Sie die kwargs benannt, da Sie in der Funktion: func(1, 2, 3, kwarg1='me', kwarg2=10)
InformationsquelleAutor Peter Hoffmann
Es ist auch erwähnenswert, dass können Sie
*
und**
beim aufrufen von Funktionen. Dies ist eine Verknüpfung, können Sie mehrere Argumente übergeben, um eine Funktion direkt entweder eine Liste/Tupel oder dictionary. Zum Beispiel, wenn Sie haben die folgende Funktion:Können Sie Sachen wie tun:
Hinweis: Die Schlüssel in
mydict
haben, benannt zu werden, genau wie die Parameter der Funktionfoo
. Sonst wird es werfen eineTypeError
:InformationsquelleAutor Lorin Hochstein
Single * bedeutet, dass es kann eine beliebige Anzahl von zusätzlichen positions-Argumente.
foo()
kann aufgerufen werden wiefoo(1,2,3,4,5)
. Im Körper von foo() param2 ist eine Sequenz mit 2-5.Den Doppel - * * bedeutet, es kann eine beliebige Anzahl von extra benannten Parameter.
bar()
kann aufgerufen werden wiebar(1, a=2, b=3)
. In den Körper von bar() param2 ist ein Wörterbuch mit {'a':2, 'b':3 }Mit dem folgenden code:
die Ausgabe ist
InformationsquelleAutor nickd
Ermöglichen Sie Funktionen werden definiert, um zu akzeptieren und für Benutzer zu übergeben eine beliebige Anzahl von Argumenten positionierten (
*
) und keyword (**
).Definition Von Funktionen
*args
ermöglicht eine beliebige Anzahl von optionalen positions-Argumente (Parameter), die zugewiesen werden, um ein Tupel mit Namenargs
.**kwargs
ermöglicht eine beliebige Anzahl von optionalen Schlüsselwort-Argumente (Parameter), die in einem dict namenskwargs
.Kann (und sollte) wählen Sie einen beliebigen geeigneten Namen, aber wenn das die Absicht ist für die Argumente, um nicht-spezifische Semantik, die
args
undkwargs
sind die standard-Namen.Erweiterung, die Übergabe einer beliebigen Anzahl von Argumenten
Können Sie auch
*args
und**kwargs
übergeben Parameter von Listen (oder beliebig iterierbar) und dicts (oder mapping), beziehungsweise.Die Funktion empfängt die Parameter, die nicht wissen, dass Sie ausgebaut wird.
Beispielsweise Python 2 xrange nicht explizit erwarten
*args
, aber da dauert es 3 ganze zahlen als Argumente:Als ein weiteres Beispiel, das wir verwenden können, dict expansion in
str.format
:Neues in Python 3: Definition von Funktionen mit dem Schlüsselwort nur Argumente
Können Sie Stichwort nur Argumente nach der
*args
- zum Beispiel hierkwarg2
gegeben werden müssen, als keyword-argument - nicht positionsbezogen:Verwendung:
Auch
*
kann allein verwendet werden, um anzuzeigen, dass das Schlüsselwort nur Argumente Folgen, ohne dass für unbegrenzte positions-Argumente.Hier
kwarg2
wieder muss ein explizit benannt, keyword-argument:Ist und wir nicht länger akzeptieren können unbegrenzt positionale Argumente, weil wir nicht
*args*
:Wieder, mehr einfach, hier benötigen wir
kwarg
sein name, nicht positionsbezogen:In diesem Beispiel sehen wir, dass, wenn wir versuchen, pass
kwarg
positionsbezogen, bekommen wir einen Fehler:Müssen wir explizit übergeben Sie die
kwarg
parameter als keyword-argument.Python-2 kompatibel demos
*args
(in der Regel gesagt "star-args") und**kwargs
(Sterne, kann impliziert werden, indem Sie sagen: "kwargs", sondern explizit mit "Doppel-Sterne "kwargs") sind häufige Redewendungen von Python für die Verwendung der*
und**
notation. Diese speziellen Variablen-Namen sind nicht erforderlich (z.B. könnten Sie*foos
und**bars
), aber eine Abkehr von der Konvention dürfte Wutanfall Ihre Kolleginnen und Python-Programmierer.In der Regel verwenden wir diese, wenn wir nicht wissen, was unsere Funktion erhalten oder wie viele Argumente wir können vorbei, und manchmal sogar bei der Namensgebung jede variable separat bekommen würde sehr chaotisch und redundant (aber dies ist ein Fall, wo in der Regel explizit ist besser als implizit).
Beispiel 1
Die folgende Funktion beschreibt, wie Sie verwendet werden können, und zeigt, Verhalten. Beachten Sie die benannten
b
argument verbraucht wird, durch die zweite positionelle argument vor :Wir können überprüfen Sie die online Hilfe für die Funktion Unterschrift, mit
help(foo)
, die uns sagt,Nennen wir diese Funktion mit
foo(1, 2, 3, 4, e=5, f=6, g=7)
ausgegeben:
Beispiel 2
Können wir nennen es auch mit einer anderen Funktion, in die wir liefern nur
a
:bar(100)
Drucke:Beispiel 3: praktische Anwendung in decorators
OK, also vielleicht sind wir nicht zu sehen, das Dienstprogramm noch. So stellen Sie sich vor Sie haben mehrere Funktionen, die mit redundanten code vor und/oder nach der Differenzierung von code. Die folgenden genannten Funktionen sind nur pseudo-code für illustrative Zwecke.
Könnten wir handhaben das anders, aber wir können sicherlich extrahieren Sie die Redundanz mit einem Dekorateur, und so unser Beispiel unten zeigt, wie
*args
und**kwargs
sehr nützlich sein kann:Nun jedes gewickelt Funktion geschrieben werden kann viel mehr kurz und bündig, wir haben ausgeklammert, die Redundanz:
Und durch factoring aus unserem code, die
*args
und**kwargs
können wir das tun, reduzieren wir die Zeilen code, die Lesbarkeit und Wartbarkeit, und allein die kanonischen Positionen für die Logik in unserem Programm. Wenn wir ändern müssen Teil dieser Struktur, wir haben einen Ort, in dem jeder ändern.InformationsquelleAutor Aaron Hall
Lassen Sie uns zuerst verstehen, was sind die positions-und Schlüsselwort-Argumente Argumente.
Unten ist ein Beispiel der definition einer Funktion mit Positions-Argumente.
Dies ist also die definition einer Funktion, die mit positions-Argumenten.
Sie können es nennen, mit keyword/benannte Argumente:
Nun lasst uns mal ein Beispiel der definition einer Funktion mit keyword-Argumente:
Können Sie diese Funktion aufrufen, die mit positions-Argumenten:
So wissen wir jetzt, Funktionsdefinitionen mit positions-sowie keyword-Argumenten.
Nun lasst uns mal die ' * '- operator und '* * ' - operator.
Bitte beachten Sie, dass diese Operatoren können verwendet werden in 2 Bereiche:
a) Funktionsaufruf
b) Funktion definition
Die Verwendung von ' * '- operator und '* * ' - operator in Aufruf der Funktion.
Kommen wir direkt zu einem Beispiel und diskutieren dann.
Also denken Sie daran
wenn der '*' oder '* * ' - operator verwendet, der in einem Funktionsaufruf -
'*'- operator entpackt Datenstruktur wie eine Liste oder Tupel-Argumente gebraucht werden, durch definition einer Funktion.
'**'- operator entpackt ein Wörterbuch, in Argumente benötigt die Funktion definition.
Nun lasst uns mal die ' * ' - operator verwenden in Funktion definition.
Beispiel:
In der Funktion definition die ' * ' - operator packt die erhaltenen Argumente in einem Tupel.
Nun lassen Sie uns sehen, ein Beispiel von '* * '' in Funktion definition:
In der Funktion definition Der '* * ' - operator packt die erhaltenen Argumente in ein dictionary.
Also denken Sie daran:
In einem Funktionsaufruf der '*' entpackt Datenstruktur Tupel oder Liste in positions-oder keyword-Argumente, die empfangen werden durch die definition einer Funktion.
In einem Funktionsaufruf der '**' entpackt Datenstruktur des dictionary in positions-oder keyword-Argumente, die empfangen werden durch die definition einer Funktion.
In einem Funktion definition der '*' packs positions-Argumente in einem Tupel.
In einem Funktion definition der '**' packs keyword-Argumente in einem dictionary.
InformationsquelleAutor Karan Ahuja
*
und**
haben eine Besondere Verwendung in der Funktion argument-Liste.*
bedeutet, dass das argument eine Liste und
**
bedeutet, dass das argumentist ein Wörterbuch. Dies ermöglicht es Funktionen zu nehmen beliebige Anzahl von
Argumente
InformationsquelleAutor ronak
Während verwendet für die Sterne/splat Betreiber erweitert in Python 3, ich mag die folgende Tabelle bezieht sich auf die Verwendung dieser Operatoren mit Funktionen. Der splat-operator(s) kann verwendet werden, sowohl innerhalb als Funktion Bau und in der Funktion nennen:
Wirklich nur dient zum zusammenfassen von Lorin Hochstein ist Antwort aber ich finde es hilfreich.
InformationsquelleAutor Brad Solomon
Für diejenigen, die lernen, indem Sie Beispiele!
*
ist, um Ihnen die Möglichkeit der Definition einer Funktion kann eine beliebige Anzahl von Argumenten als Liste (z.B.f(*myList)
).**
ist, um Ihnen die Fähigkeit zu ernähren, eine Funktion, die die Argumente, indem Sie ein Wörterbuch (z.B.f(**{'x' : 1, 'y' : 2})
).Lassen Sie sich von uns zeigen dies, indem Sie eine Funktion definieren, die zwei normale Variablen
x
,y
, und kann akzeptieren, mehr Argumente alsmyArgs
, und kann akzeptieren, auch mehr Argumente alsmyKW
. Später werden wir zeigen, wie Sie zu fütterny
mitmyArgDict
.Vorsichtsmaßnahmen
**
ist ausschließlich für Wörterbücher.**
muss nach*
immer.InformationsquelleAutor Miladiouss
Aus der Python-Dokumentation:
InformationsquelleAutor Chris Upchurch
In Python 3.5, können Sie auch folgende syntax verwenden, die in
list
,dict
,tuple
, undset
zeigt (manchmal auch Literale genannt). Sehen PEP 488: Zusätzliche Auspacken Verallgemeinerungen.Ermöglicht es auch, mehrere iterables entpackt werden in einem einzigen Funktionsaufruf.
(Dank mgilson für die PEP-link.)
das würde erklären, warum es nicht erwähnt.
InformationsquelleAutor leewz
Möchte ich ein Beispiel geben, dem andere noch nicht erwähnt habe,
* kann auch entpacken einer generator
Einem Beispiel aus der Python ist3 Dokument
unzip_x werden [1, 2, 3], unzip_y werden [4, 5, 6]
Zip() empfängt mehrere iretable Argumente, und liefert ein generator.
InformationsquelleAutor Lochu'an Chang
Neben Funktionsaufrufe, *args und **kwargs sind nützlich in der Klasse Hierarchien und auch vermeiden, dass zu schreiben
__init__
Methode in Python. Ähnliche Nutzung kann man in frameworks wie Django-code.Beispielsweise
Einer Unterklasse können dann
Die Unterklasse, die dann instanziiert werden, wie
Ebenfalls eine Unterklasse mit einem neuen Attribut, das macht nur Sinn, zu diesem Unterklasse-Instanz anrufen können, die Basis-Klasse
__init__
zur Entlastung der Attribute festlegen.Dies erfolgt mittels *args und **kwargs. kwargs hauptsächlich verwendet, damit der code lesbar ist die Verwendung von benannten Argumenten. Zum Beispiel,
werden kann instatiated als
Ist aber der komplette code hier
InformationsquelleAutor HarisankarK
*
bedeutet, dass eine variable, Argumente als Liste**
bedeutet, dass eine variable, Argumente WörterbuchVerwendet wie die folgenden:
1) single *
Ausgabe:
2) Jetzt
**
Ausgabe:
InformationsquelleAutor ishandutta2007
Ein gutes Beispiel für die Verwendung in einer Funktion ist:
InformationsquelleAutor amir jj
In diesem Beispiel würde helfen, denken Sie daran
*args
,**kwargs
und sogarsuper
und Vererbung in Python auf einmal.InformationsquelleAutor thanhtang
TL;DR
Er packt an die Funktion übergebenen Argumente in
list
unddict
bzw. innerhalb der Funktion Körper. Wenn Sie eine Funktion definieren, die Signatur wie diese:kann man mit einer beliebigen Anzahl von Argumenten und Schlüsselwort-Argumente. Die non-keyword-Argumente, verpackt in eine Liste namens
args
innerhalb der Funktion Körper und die keyword-Argumente, verpackt in ein dict genanntkwds
innerhalb der Funktion Körper.nun innerhalb der Funktion Körper, wenn die Funktion aufgerufen wird, gibt es zwei lokale Variablen
args
ist eine Liste mit dem Wert["this", "is a list of", "non-keyword", "arguments"]
undkwds
was ist eindict
mit dem Wert{"keyword" : "ligma", "options" : [1,2,3]}
Dies funktioniert auch in umgekehrter Richtung, d.h. von der Anrufer-Seite. zum Beispiel, wenn Sie haben eine Funktion definiert als:
rufen Sie es mit dem Auspacken iterables oder Zuordnungen, die Sie haben in der aufrufenden scope:
InformationsquelleAutor RBF06
*args
und**kwargs
: lassen Sie sich übergeben Sie eine variable Anzahl von Argumenten an eine Funktion.*args
: wird verwendet, um eine nicht-Schlüsselwörtern variable length argument list um die Funktion:Produzieren:
**kwargs*
**kwargs
ermöglicht das übergeben von Schlüsselwörtern variable Länge von Argumenten für eine Funktion. Sollten Sie verwenden**kwargs
wenn Sie behandeln möchten benannte Argumente in einer Funktion.Produzieren:
InformationsquelleAutor Harvey
def foo(param1, *param2):
ist eine Methode akzeptieren können beliebig viele Werte für*param2
,def bar(param1, **param2):
ist eine Methode akzeptieren können beliebig viele Werte mit Schlüsseln für*param2
param1
ist ein einfacher parameter.Beispielsweise die syntax für die Implementierung varargs in Java wie folgt:
InformationsquelleAutor Premraj