Wie am besten Argumente an eine Funktionen übergeben

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
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Hallo ich weiß die Frage klingt doof, aber ich habe Probleme eine gute Möglichkeit zu finden Argumente an eine Funktion zu übergeben.

Ich würde das gerne über eine Liste machen. Die Funktion soll also anstatt:

Code: Alles auswählen

def funktion(Ausgaben,Einkommen):
wie folgt aussehen:

Code: Alles auswählen

def funktion(argumentliste):
Ich möchte die Werte aus der Liste auslesen indem ich z.B. nach Argument 1 also Ausgaben frage und dann die passende Zahl erhalte, also nicht nach dem Index in der Liste frage. Ich versuche dies verzweifelt mit verschachtelten Listen was mir aber nicht gelingen möchte.

Ich bin scheinbar zu blöd, dazu. In C mache ich das üblicherweise in dem ich für die Argumente globale int-Werte definiere wie zB Ausgaben = 1 (def Ausgabe 1), Einkommen = 2, und dann die definierten Bezeichnungen als Index für die Listen verwende.

Wie kann ich soetwas elegant mit Python machen ? Wie macht ihr das ?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Meinst Du so etwas:

Code: Alles auswählen

def foo(*args):
    for arg in args:
        print arg
    print args

foo(1,2,3,'a','b','c')
Gruss,
Christian
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Hi, Lufia.

Code: Alles auswählen

def f(dict_={}):
    print dict_
    print dict_['ausgaben']
    print '-' * 80

dict_ = {'ausgaben': 1, 'test:': 1}
f(dict_)

# Besser:
def f(*args, **kwargs):
    print args
    print kwargs
    if kwargs:
        print "ausgaben: %s" % kwargs['ausgaben']
    print '-' * 80
    
f(1, 2, 3)
f(ausgaben=1, test=1)
Zuletzt geändert von sape am Mittwoch 10. Januar 2007, 16:03, insgesamt 1-mal geändert.
BlackJack

Grundsätzlich frage ich mich erst einmal wo der Sinn liegt eine aussagekräftige Argumentliste durch ein einziges Argument zu ersetzen? Die erste Variante *ist* eine gute Möglichkeit Argumente an eine Funktion zu übergeben.

Wenn diese Argumente zusammengehören und deshalb zum Beispiel auch zusammengefasst in einer Liste oder ähnlichem abgelegt werden sollen, dann fasst man sie mit einer Klasse zu einem Objekt zusammen. Genauso wie man in C dafür eigentlich ein ``struct`` verwenden würde anstatt eines Arrays mit "magischen" Konstanten für den Zugriff.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

BlackJack hat geschrieben:[...]
Wenn diese Argumente zusammengehören und deshalb zum Beispiel auch zusammengefasst in einer Liste oder ähnlichem abgelegt werden sollen, dann fasst man sie mit einer Klasse zu einem Objekt zusammen. Genauso wie man in C dafür eigentlich ein ``struct`` verwenden würde anstatt eines Arrays mit "magischen" Konstanten für den Zugriff.
Richtig. Wo wir bei der Frage wären was Lufia eigentlich machen möchte.
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Danke für die Antworten, ich denke der Begriff Stuktur aus C bezeichnet am besten was ich machen möchte.

Ich sollte also die Argumente mit einer Klasse zu einem Objekt zusammenfügen. (Da muß ich mich erstmal noch etwas in die Kalssen sachen einlesen)

Ich habe verschiedene mathematische Funktionen welche ich öfters verwende und darum in ein Modul speichern wollte. Dabei müssen den Funktionen meist recht viele Argumente übergeben werden. Da ein iner normalen Liste diese nur durch einen Index gekennzeichnet sind ist das recht unpraktisch beim öfteren verwenden des Codes da die Argumente immer an der richtigen Stelle stehen müssen und dies eine enorme Fehlerquelle ist.
Anbei ein kleines Beispiel einer solchen Funktion:

Code: Alles auswählen

def CapillaryVG(Sw,Swr,Snr,VGalpha,VGn):
    """Compute Capillary Pressure after van Genuchten.

    Arguments:  Sw  (water saturation)
                         Swr (residual saturation wetting phase)
                         Snr (residual stauration non-wetting phase)
                         VG_alpha (van Genuchten parameter alpha)
                         VG_m (van Genuchten Parameter m)
    Result:          pc (capillary pressure)"""

    VGm         =  1.0-(1.0/VGn)    
    Se             = (Sw - Swr) / (1-Snr-Swr)
    sequad     = pow(Se,(-1.0/VGm))    
    pc             = (1.0/VGalpha) * pow((sequad-1.0),(1.0/VGn))   
    return pc
Bei den 5 Argumenten kommte es leicht zu Verwechslungen.
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Lufia hat geschrieben:[...]da die Argumente immer an der richtigen Stelle stehen müssen und dies eine enorme Fehlerquelle ist.
Ah, ok. nun weiß ich genau was du willst :) Kein Problem. Benutze Keywords :)

So zum beispiel:

Code: Alles auswählen

CapillaryVG(Snr="irgendwas", VGalpha="irgendwas",VGn="irgendwas", ...)
Wie du siehst, spielt dann die Reihenfolge der Argumente dann keine Rolle mehr :)

lg
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Besseres Beispiel:

Code: Alles auswählen

def f(x, y, z)
    print x, y, z

f(1, 2, 3) # Hier wird der Reihenfolge nach übergeben

# Hier ist die Reihenfolge egal, da die Namen der Parameter angegeben werden und Python das erkent und dan entsprechend den richtigen Argumente übergibt.
f(y=1, z=0, x=5) 
f(z=0, x=5, y=1)
Lufia
User
Beiträge: 83
Registriert: Samstag 13. Mai 2006, 10:04
Wohnort: Berlin

Vielen Dank !!!!

Das ist ja perfekt, da habe ich wie immer viel zu kompliziert gedacht. :(

Irgendwie geht fast alles leichter als man denkt :D
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Noch ein anderer Vorschlag: Wenn Sie die Daten zusammenfassen wollte (so etwa wie ein struct) aber das Problem der Reihenfolgenverwechslung umgehen will, dann könnte sie doch auch ein Dictionary übergeben, oder?
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Man könnte natürlich erst die Werte in einem Dictionary sammeln und es dann übergeben, ja. Aber bevor man die Funktion dieses als einziges Argument annehmen lässt, kann man sie weiterhin mit Keyword-Argumenten belassen und dann das Dictionary so übergeben:

Code: Alles auswählen

def siehmaleineran(eins='hallo', zwei=None, drei=456):
    pass

d = dict(eins=1, zwei=2, drei=3)
siehmaleineran(**d)
So werden quasi die einzelnen Schlüssel-Wert-Paare aus dem Dictionary implizit entnommen und als Keyword-Argumente übergeben.
Antworten