So viele IF - Anweisungen nötig?

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
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

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 ?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
blubber
User
Beiträge: 123
Registriert: Montag 19. März 2007, 09:08

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.
htw7448
User
Beiträge: 51
Registriert: Montag 16. April 2007, 10:59
Wohnort: Messel(Hessen)
Kontaktdaten:

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

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ß
[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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

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...
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Goa
User
Beiträge: 18
Registriert: Dienstag 10. Oktober 2006, 11:00

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)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Natürlich geht das, und wenn die Funktion mehr als z.B. "x*y + z" enthält, würde ich das auch so machen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten