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.