Funktionsparameter Ausgabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Hallo an alle,

ich habe wieder eine kleine Frage bei der ich nicht genau weiss was Python genau macht.
Als Beispiel diese Funktion:

Code: Alles auswählen

def g(c, *args, **kwargs):
    print(*args, **kwargs)
    print(args, kwargs)
    print("c:", c)


g(*[1,2,3])
Die Ausgabe sieht dann wie folgt aus:

Code: Alles auswählen

2 3
(2, 3) {}
c: 1
c:1 kommt denke ich zustande weil es ja im dict schon so "vorgegeben" ist. Warum macht er aber aus args = (2,3) und aus kwargs = {}?

Viele Grüße
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Hui, da geht dir aber einiges durcheinander. Deine Argumente stecken in einer LISTE, nicht einem dict. Dadurch koennen sie auch keinen einzelnen Namen haben, sind folglich das, was Python als "positional args" bezeichnet. Und die werden mit dem *args generisch aufgesammelt.

Vorher findet sich aber noch ein positional Argument "c", und das wird immer zu erst bedient. Also wird das erste Element aus deiner Liste - die 1 - an c gebunden, der Rest vom *args aufgefangen. Und da es keine benannten Keyword-Argumente gibt, ist **kwargs leer.
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Danek für deine Antwort :)
Ach sorry, weiss gar nicht wie ich auf dict komme :D
Ok also arbeitet er erst c1=c ab? Und args=(2,3) kommt zustande weil er bei args dann alle restlichen Elemente der Liste nimmt und zusammen packt, und kwargs ist dann folglich Leer weil keine Elemente mehr zur verfügung stehen?
Aber warum wird dann aus kwargs ein dict?
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Ambriador: kwargs sind Keyword-Argumente, also Argumente mit Namen. Im Gegensatz zu positional arguments ist dort die Reihenfolge nicht wichtig, da sie ja einen Namen haben, und die Zuordnung Name -> Wert wird passenderweise mit einem dict gemacht:

Code: Alles auswählen

g(a=4, c=3, y=9)
Ambriador
User
Beiträge: 35
Registriert: Freitag 25. November 2016, 01:05

Ah ok, also werden **kwargs und kwargs gar nicht "benutzt" da es keine Zuweisungen gibt?
Andersrum wäre es dann so das *args und args auch kein dict wie {'a':1} "benutzen"?
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

nein, sie benutzen kein dict - wie sollen sie auch, es gibt ja keine Namen dazu. Es sind positionale Argumente.
Antworten