Seite 1 von 1

Funktionsparameter Ausgabe

Verfasst: Sonntag 11. Dezember 2016, 11:42
von Ambriador
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

Re: Funktionsparameter Ausgabe

Verfasst: Sonntag 11. Dezember 2016, 11:46
von __deets__
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.

Re: Funktionsparameter Ausgabe

Verfasst: Sonntag 11. Dezember 2016, 12:12
von Ambriador
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?

Re: Funktionsparameter Ausgabe

Verfasst: Sonntag 11. Dezember 2016, 12:19
von Sirius3
@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)

Re: Funktionsparameter Ausgabe

Verfasst: Sonntag 11. Dezember 2016, 19:45
von Ambriador
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"?

Re: Funktionsparameter Ausgabe

Verfasst: Freitag 23. Dezember 2016, 14:13
von __deets__
nein, sie benutzen kein dict - wie sollen sie auch, es gibt ja keine Namen dazu. Es sind positionale Argumente.