Mit einem If-Else kann eine Verzweigung programmiert werden. Auf Deutsch übersetzt ganz einfach: «Wenn … dann … sonst …».
Python kennt zwischen if
und else
ein spezielles «else if» geschrieben als elif
.
if bedingung1:
block1
elif bedingung2:
block2
else:
block3
block4
Beispiel
Wir erweitern unser bekanntes Unterprogramm zur Lösung einer Quadratischen Gleichung. Unsere letzte Version quadr.py
hat das Problem, dass sie nicht berücksichtigt, dass nicht alle Quadratische Gleichungen zwei Lösungen haben: Es gibt solche die nur eine und solche die gar keine Lösung besitzen.
Das Problem liegt beim Teil unter der Wurzel, der sogenannten Diskriminante. Diese darf nicht negativ sein, da sonst die Wurzel undefiniert ist.
Wir berechnen zuerst also die Diskriminante
Dann unterscheiden wir drei Fälle:
- Wir können die Wurzel von
ziehen, in die Formel einsetzen und erhalten zwei Lösungen - Die Wurzel von
ist . Somit hat das keinen Einfluss. Es gibt nur eine Lösung. - Die Wurzel ist nicht definiert und kann nicht berechnet werden. Die Gleichung hat keine Lösung.
from math import sqrt
def quadr_if(a, b, c):
D = b**2 - 4*a*c
if D > 0:
x1 = (-b + sqrt(D))/(2*a)
x2 = (-b - sqrt(D))/(2*a)
return (x1, x2)
elif D == 0:
x = -b/(2*a)
return x
print("Dieses Programm löst eine Quadratische")
print("Gleichung der Form ax^2 + bx + c = 0")
a = float(input("Gib den Wert für den Koeffizienten a ein: "))
b = float(input("Gib den Wert für den Koeffizienten b ein: "))
c = float(input("Gib den Wert für den Koeffizienten c ein: "))
result = quadr_if(a, b, c)
print(result)
if type(result) == tuple:
print("Die Lösungen lauten:")
print("x1 =", result[0])
print("x2 =", result[1])
elif type(result) == float:
print("Die Lösung lautet:",result)
else:
print("keine Lösung")
from math import sqrt
def quadr(a, b, c):
x1 = (-b + sqrt(b**2 - 4*a*c))/(2*a)
x2 = (-b - sqrt(b**2 - 4*a*c))/(2*a)
return (x1, x2)
print("Dieses Programm löst eine Quadratische")
print("Gleichung der Form ax^2 + bx + c = 0")
a = float(input("Gib den Wert für den Koeffizienten a ein: "))
b = float(input("Gib den Wert für den Koeffizienten b ein: "))
c = float(input("Gib den Wert für den Koeffizienten c ein: "))
(x1, x2) = quadr(a, b, c)
print("Die Lösungen lauten:")
print("x1 =", x1)
print("x2 =", x2)
Das Skript quadr_if.py
hat 2 If-Else-Strukturen:
- ab Zeile 5
- Hier werden ja nach Wert der Diskriminante
D
2 oder 1 Lösung berechnet. Wenn die Gleichung keine Lösung hat, wird gar nichts zurückgegeben - ab Zeile 23
- Da unser Unterprogramm entweder ein Tupel von 2 Werten, oder ein einzelner Wert, oder aber nichts zurückgibt, müssen wir hier nochmals eine Fallunterscheidung machen und herausfinden, was wir vom Unterprogramm erhalten.
Syntax
Der if
-Teil ist zwingend und kommt immer zuerst. Optional wird er gefolgt von einem oder mehreren elif
-Teilen. Am Schluss steht ein optionaler else
-Teil.
if bedinung1:
befehl1
befehl2
...
elif bedingung2:
befehl3
befehl4
...
else:
befehl5
befehl6
...
if bedinung1:
befehl1
befehl2
...
if bedinung1:
befehl1
befehl2
...
else:
befehl3
befehl4
...
if bedinung1:
befehl1
befehl2
...
elif bedingung2:
befehl3
befehl4
...
bedingungX
sind Ausdrücke welche True
oder False
ergeben.
Verschachtelung
Das elif
kann auch als verschachteltes If-Else
geschrieben werden:
if bedingung1:
block1
elif bedingung2:
block2
else:
block3
block4
if bedingung1:
block1
else:
if bedingung2:
block2
else:
block3
block4
Die elif
-Notation ist aber etwas übersichtlicher, da sonst – gerade bei mehreren «Else-Ifs» – immer weiter eingerückt werden muss.
Allgemein können diese Programmier-Strukturen ineinander verschachtelt werden. Es ist also möglich in einem Unterprogramm ein If-Else zu haben (so wie im Beispiel zu oberst). Es ist aber auch möglich im If-Else ein weiteres If-Else zu haben.
if bedingung1:
block1
if bedingung2:
block2
else:
block3
block4
else:
block5
block6
Jedes blockX
kann beliebig mit Befehlen und auch weiteren If-Else versehen werden!