Argumentsliste anzeigen

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
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Mittwoch 21. März 2007, 17:33

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
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 21. März 2007, 17:39

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
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Mittwoch 21. März 2007, 22:54

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.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 22. März 2007, 11:44

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.
Antworten