Seite 1 von 1
Argumentsliste anzeigen
Verfasst: Mittwoch 21. März 2007, 17:33
von keboo
Hallo Leute!
Kurze Frage:
Ich möchte eine For Schleife über alle Argumente schreiben, welche im Funktionsaufruf stehen. Gibt es eine Pythonstandardfunktion, in welcher ich die Argumente in einer Liste stehen habe?
zB.:
Code: Alles auswählen
def test (x,y,z):
for arg in arglist:
print arg
return
Danke,
Johannes
Verfasst: Mittwoch 21. März 2007, 17:39
von rayo
Hi
So kannst du das:
Code: Alles auswählen
def test(*args, **kwargs):
for x in args:
print x
for k,v in kwargs.items():
print '%s -> %s' % (k, repr(v))
test(1, 5, 'a', test='neu', abc=5)
Gruss
Verfasst: Mittwoch 21. März 2007, 22:54
von nkoehring
Fuer den Fall, dass du das so meinst, hier noch eine kurze Erklaerung zu Rayo's Antwort:
Code: Alles auswählen
def test(*args, **kwargs):
for x in args:
print x
for k,v in kwargs.items():
print '%s -> %s' % (k, repr(v))
test(1, 5, 'a', test='neu', abc=5)
In seinem Beispiel verwendet er
*args und
**kwargs. Das sind zwei verschiedene Moeglichkeiten, mit denen man beliebige Argumente an eine Funktion zulaesst.
*args erzeugt eine Liste ("args" ist hier ein freiwaehlbarer Bezeichner) aus Werten, die aber keinerlei Korrelation besitzen. Hast du also zB eine Funktion zu Summenberechnung:
Code: Alles auswählen
def summe(*summanden):
out = 0
for summand in summanden:
out += summand
return out
# ja, bevor man mich steinigt:
sum(summanden) # tuts auch ;)
In diesem Fall ist
*summanden eine Liste.
Brauchst du aber eine Funktion, bei der Namen zu den Parameter brauchst, nutzt du
**kwargs:
Code: Alles auswählen
def widerstand(**kwargs):
""" gibt den temperaturabhaengigen Widerstand (<100°C) zurueck """
r20 = kwargs["r20"] # Widerstand bei 20°C
alpha20 = kwargs["alpha20"] # TemperaturKoeffizient bei 20°C
delta_v = kwargs["delta_v"] # Temperaturveraenderung in Kelvin
return r20*(1+alpha20*delta_v)
...in dem Fall ist
**kwargs also ein Dictionary.
Verfasst: Donnerstag 22. März 2007, 11:44
von Y0Gi
Ich halte die Erklärung zumindest für irrefürend. Daher: *args enthält alle non-Keyword-Argumente und **kwargs alle Keyword-Argumente.
Wenn du eine Funktion x('hallo') aufrufst, taucht 'hallo' in *args auf, wenn du den Aufruf aber in x(greeting='hallo') ändernst, tauchen Schlüssel und Wert in **kwargs auf. Damit kann durchaus der selbe Parameter gemeint sein, nur es wird zwischen den benannten und den nur durch die Position bestimmten aufgeteilt. Keyword-Argumente können auch immer nur *nach* den positionalen Argumenten in Signatur und Aufruf von Funktionen/Methoden stehen.