Seite 1 von 1
Wie am besten Argumente an eine Funktionen übergeben
Verfasst: Mittwoch 10. Januar 2007, 15:47
von Lufia
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:
wie folgt aussehen:
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 ?
Verfasst: Mittwoch 10. Januar 2007, 15:57
von CM
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
Verfasst: Mittwoch 10. Januar 2007, 16:00
von sape
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)
Verfasst: Mittwoch 10. Januar 2007, 16:02
von 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.
Verfasst: Mittwoch 10. Januar 2007, 16:05
von sape
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.
Verfasst: Mittwoch 10. Januar 2007, 16:27
von Lufia
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.
Verfasst: Mittwoch 10. Januar 2007, 16:41
von sape
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
Verfasst: Mittwoch 10. Januar 2007, 16:44
von sape
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)
Verfasst: Mittwoch 10. Januar 2007, 17:42
von Lufia
Vielen Dank !!!!
Das ist ja perfekt, da habe ich wie immer viel zu kompliziert gedacht.
Irgendwie geht fast alles leichter als man denkt

Verfasst: Donnerstag 11. Januar 2007, 19:18
von Bernhard
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?
Verfasst: Freitag 12. Januar 2007, 15:59
von Y0Gi
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.