Seite 1 von 1

So viele IF - Anweisungen nötig?

Verfasst: Dienstag 24. April 2007, 13:46
von blubber
Hallo,

ich hab hier grad ein Problem in Code umgesetzt, was zwar funktioniert, allerdings sind für meine Umsetzung sehr viele IF Anweisungen nötig, nun wollte ich fragen, ob das mit Python eleganter geht. Und zwar:
Ich hab 3 Variable, nennen wir sie a, b, c
Variable a kann 4 Werte annehmen, Variable b kann 2 Werte annehmen und Variable c kan ebenfalls 2 Werte annehmen.
Ich muss nun alle Kombinationsmöglichkeiten abdecken und je nach Kombination bestimmte Werte (von anderen Variablem) zusammenrechnen und returnen.
Also so sieht mein Code aus:

Code: Alles auswählen

if a == 1:
    if b == 1:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
    elif b == 2:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
if a == 2:
    if b == 1:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
    elif b == 2:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
if a == 3:
    if b == 1:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
    elif b == 2:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
if a == 4:
    if b == 1:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
    elif b == 2:
        if c == 1:
            return #die berechneten Werte
        elif c == 2:
            return #die berechneten Werte
Geht das einfacher in Python ?

Verfasst: Dienstag 24. April 2007, 14:33
von jens
Keine Ahnung was dein Programm überhaupt macht... Oft kann man IF Anweisungen durch ein dict sehr vereinfachen...

Vielleicht interessant für dich: http://www.python-forum.de/topic-1812.html

Verfasst: Dienstag 24. April 2007, 14:54
von blubber
Wie gesagt, überall wo "return #die berechneten Werte"steht werden eben abhängig von der Kombination aus a,b,c verschiedene Rechnungen durchgeführt und dann das Ergebnis zurückgegeben.

Verfasst: Dienstag 24. April 2007, 15:05
von htw7448
Hallo,

bin zwar selbst noch Anfänger, aber ich würde es so machen.

Da es aber so sein dürfte, daß deine Berechnugen für alle Fälle auf einen kleinen gemeinsamen Nenner zu bringen sind, ergeben sich sicher noch Optimierungsmöglichkeiten.[

Code: Alles auswählen

calc= {}

for a in range (1, 5):		# dient nur zum erstellen eines Muster- ´´dict´´ 
	for b in range (1, 3):
		for c in range (1, 3):
			calc[a, b , c]= "a+b+c"		# a, b, c musst du im fertigen ´´dict´´ mit deinen Formeln ersetzen
			
print calc
			
for a in range (1, 5):
	for b in range (1, 3):
		for c in range (1, 3):
			ergebnis = eval(calc[a, b, c])
			print ergebnis

Verfasst: Dienstag 24. April 2007, 17:25
von birkenfeld
Eine Möglichkeit:

Code: Alles auswählen

funcs = {
    (1, 1, 1): lambda x, y, z: 0, # Die Argumente hängen natürlich davon ab, was du berechnen willst.
    (1, 1, 2): ...
}

func = funcs[(a, b, c)]
return func(x, y, z)

Verfasst: Mittwoch 25. April 2007, 09:31
von nkoehring
moin...

@birkenfeld: ich glaube, dass solltest du mal naeher erleutern. Ist ja wirklich ein schickes Beispiel, bei dem man gut sieht, was Python alles so kann... aber wer kein Vollprofi ist, versteht das glaube nicht so ohne weiteres. Wenn ich mir sicher waere, was da genau passiert (und ich mehr Zeit haette) wuerde ich dir die Arbeit ja auch abnehmen ^^

gruß

Verfasst: Mittwoch 25. April 2007, 11:55
von EyDu
Ist von Prinzip her ganz einfach:

Es wird ein Dictionary "funcs" erzeugt, welches als Schlüssel alle auftretenden Kombinationen von a, b und c. Jedem Schlüssel wird die zu ihm gehörige Funktion zugeweisen, die bei dieser Kombination ausgeführt werden sol (Zeilen 2 bis 5).

In Zeile 7 wird aus dem Dictionary "funcs" der konkrete Eintrag zu (a,b,c) geholt und "func" zugewiesen. Wie man dem Name schon entnehmen kann, wird eine der oben definierten Funktionen geliefert.

In Zeile 8 wird diese dann nur noch ausgeführt.

Zu "lamda" sollte in der Doku genug zu finden sein.

Verfasst: Mittwoch 25. April 2007, 15:38
von birkenfeld
Ich weiß, dass ich das hätte erklären sollen, allerdings fehlt mir dazu häufig die Zeit...

EyDus Beschreibung ist ganz richtig, aber wahrscheinlich ist der Knackpunkt für Newbies eben das ``lambda`` -- vielleicht gibts da eine Wikiseite dazu...

Verfasst: Donnerstag 26. April 2007, 11:10
von Goa
das geht doch auch ohne lambdas, mit vorher definierten Funktionen, oder täusche ich mich da? Das heisst ich übergebe einfach den Namen einer Funktion. Bei komplizierteren Funktionen könnte das sogar notwendig sein.

z.B.

Code: Alles auswählen

def func111(x,y):
   return x*y

def func112(x,y):
   return x**y

...

funcs = {
         (1,1,1) : func111,
         (1,1,2) : func112,
...
}

func = funcs[(1,1,1)]
func(5,4)

Verfasst: Donnerstag 26. April 2007, 11:26
von birkenfeld
Natürlich geht das, und wenn die Funktion mehr als z.B. "x*y + z" enthält, würde ich das auch so machen.