lehrkraefte:snr:informatik:glf22:python:if-else

if-(else-)statements

Unsere bisherigen Python-Programme werden beim Ausführen von vorne beginnend Zeile für Zeile abgearbeitet.

Oft sollen gewisse Programmteile aber nur unter gewissen Bedingungen ausgeführt werden. Das geht in Python durch sogenannte if-statements bzw. if-else-statements.

Schau dir das folgende Video zu if- und if-else-statements an.

Video "Einführung if und if-else"

Endzustand des Programms aus dem Video

Endzustand des Programms aus dem Video

tageslicht.py
t = int(input("Wie viele Minuten Tageslicht hattest Du heute bereits? "))
 
if t >= 120:
    print("Prima!")
    print("Deine Augen werden es dir langfristig danken.")
else:
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
print("Programmende")

Hintergrundinformation: Zwei Stunden Tageslicht pro Tag minimieren laut wissenschaftlicher Studien das Risiko, kurzsichtig zu werden, siehe Deutschlandfunk Kultur: Immer mehr Kinder werden kurzsichtig.

if-statement: Der um zusätzliche 4 Leerschläge eingerückte Code-Block direkt nach der if-Zeile wird ausgeführt, falls die Bedingung zwischen if und : den Wahrheitswert True hat, wenn man die aktuellen Werte der Variablen einsetzt. Wer mag, kann den Doppelpunkt : als then lesen.

if-else-statement: Der eingerückte Code-Block direkt nach der if-Zeile wird ausgeführt, falls die angegebene Bedingung wahr ist, sonst wird der eingerückte Code-Block nach der Zeile else: ausgeführt.

Danach geht es jeweils mit dem normal eingerückten Code weiter.

Einrückungen sind äusserst wichtig in Python! Beachte, dass im Programm aus dem Video drei Zeilen um genau 4 Leerschläge eingerückt sind.

In der Standard-Einstellung von Visual Studio Code kannst du solche Einrückungen (um Vielfache von 4) leicht mit Tab erzeugen (und mit Shift+Tab rückgängig machen).

Neben falschen Einrückungen sind auch vergessene Doppelpunkte eine beliebte Fehlerquelle.

(1) Schreibe ein Quiz-Programm mit mindestens zwei Quiz-Fragen deiner Wahl (möglichst einmal mit Eingabe einer Zahl und einmal mit Eingabe eines Strings).
Nach jeder Eingabe soll der Benutzer erfahren, ob er recht hatte, und sonst die richtige Antwort erfahren.
(Auch wenn du dich daran erinnerst: Schau nicht im Abschnitt über Wahrheitswerte etc. das dortige Quiz-Programm nach, sondern versuche das Programm eigenständig neu zu schreiben!)

(2) Definiere am Anfang des Programms eine Variable durch richtigeAntworten = 0. Verwende diese, um dem Benutzer am Ende mitzuteilen, wie viele der Antworten er richtig beantwortet hat. Diese Angabe darf auch in Prozent erfolgen.

(3) Teste dein Programm!

Lösungsvorschlag:

Lösungsvorschlag:

richtigeAntworten = 0
 
antwort = input("Wie heisst das kulturelle und wirtschaftliche Zentrum der Ostschweiz? ")
if (antwort == "St. Gallen") or (antwort == "St.Gallen") or (antwort == "Saint-Gall") or (antwort == "San Gallo"):
    print("Korrekt!")
    richtigeAntworten = richtigeAntworten + 1
else:
    print("Vermutlich falsch.") # denn auch "Sanggalle" oder "Sogn Gagl" oder "Sankt Gallen" oder "st. gallen" oder "STGALLEN" sollte man wohl akzeptieren...
    print("Die als richtig akzeptierten Antworten wären 'St. Gallen', 'St.Gallen', 'Saint-Gall' oder 'San Gallo' gewesen.")
 
antwort2 = int(input("Wie viele Einwohner hatte St. Gallen auf Tausender gerundet am 31. Dezember 2020? "))
if antwort2 == 76000:
    print("Richtig")
    richtigeAntworten = richtigeAntworten + 1
else:
    print("Leider falsch. Die richtige Antwort ist 76000.")
 
print("Du hast " + str(richtigeAntworten) + " von 2 Fragen korrekt beantwortet, das sind " + str(richtigeAntworten / 2 * 100) + " Prozent der Fragen.")

ACHTUNG: Die Aufgabe ist von der Logik her relativ kompliziert; der erste Hinweis entschärft dieses Problem.

Ist eine Jahreszahl durch 4 teilbar, so handelt es sich um ein Schaltjahr, es sei denn, die Jahreszahl ist durch 100, aber nicht durch 400 teilbar.

(Diese komplizerte Regel sorgt grob gesagt dafür, dass die Frühlingstagundnachtgleiche immer am selben Tag des Kalenderjahres stattfindet, nämlich dem 21. März; für genauere Informationen siehe https://de.wikipedia.org/wiki/Schaltjahr#Gregorianischer_Kalender.)

Ersetze die Fragezeichen im folgenden Python-Programm durch einen booleschen Ausdruck, so dass es korrekt ausgibt, ob die Eingabe ein Schaltjahr ist oder nicht. Teste deine Vermutung durch Eingabe der Jahreszahlen 7, 32, 300, 400.

schaltjahr.py
jahr = int(input("Jahreszahl: "))
 
if ????:
    print(str(jahr) + " ist kein Schaltjahr.")
else:
    print(str(jahr) + " ist ein Schaltjahr.")

Nullter Hinweis

Nullter Hinweis

Erinnerung:

  • Das Rechenzeichen % liefert den Rest bei ganzzahliger Division.
  • Das Vergleichszeichen == bzw. != testet auf Gleichheit bzw. Ungleichheit.
  • … und dann gibt es noch die logischen Verknüpfungen and und or.

Erster Hinweis:

Erster Hinweis:

Eine Jahreszahl steht genau dann für KEIN Schaltjahr, wenn sie (nicht durch 4 teilbar ist) oder (durch 100 teilbar und nicht durch 400 teilbar ist).

Zweiter Hinweis:

Zweiter Hinweis:

Der gesuchte boolesche Ausdruck hat die Form

(jahr % 4 ? 0) ? ((jahr % 100 ? 0) ? (jahr % 400 ? 0))

wobei die Fragezeichen durch Vergleichszeichen und logische Verknüpfungen zu ersetzen sind.

Lösungsvorschlag:

Lösungsvorschlag:

(jahr % 4 != 0) or ((jahr % 100 == 0) and (jahr % 400 != 0))

Auf Grund der “Operator-Hierarchie” in Python (vgl. Punkt-vor-Strich-Regel in der Mathematik) hat der Ausdruck

jahr % 4 != 0 or jahr % 100 == 0 and jahr % 400 != 0

dieselbe Bedeutung (denn and bindet stärker als or und Vergleichszeichen binden stärker als logische Verknüpfungen und Rechenzeichen binden stärker als Vergleichszeichen).

If-statements und if-else-statements stellen eine wichtige Kontrollstruktur in der Programmierung dar.

Sie kontrollieren bzw. steuern den Ablauf eines Programms.

Bald werden wir noch die Kontrollstrukturen Schleife (= loop) (oder Iteration) und eventuell Rekursion (= recursion) kennenlernen.

Bereits kennengelernt haben wir die “offensichtlichen” Kontrollstrukturen Sequenz (einfach diverse Anweisungen hintereinander, die entsprechend nacheinander ausgeführt werden) und Blockstruktur (etwa die beiden eingerückten Code-Blocks in einem if-else-statement).

Ich verwende hier die Begriffe if-statement und if-else-statement, da man sofort weiss, was programmiertechnisch gemeint ist.

Verbreitet (aber meiner Meinung nach weniger einprägsam) sind auch die folgenden Bezeichnungen:

  • bedingte Anweisung statt if-statement, da eine Anweisung (oder ein Block von Anweisungen) nur unter einer Bedingung durchgeführt wird;
  • Verzweigung statt if-else-statement, da der Programmablauf verzweigt (zwei mögliche Wege), am Ende kommen sie aber wieder zusammen; vgl. bedingte Anweisung und Verzweigung (dort ist auch ein “Aktivitätsdiagramm”, das den Begriff Verzweigung gut illustriert);
  • if-Selektion oder if-Auswahl statt if-statement (da ein Codeblock nur dann ausgewählt und ausgeführt wird, wenn die sogenannte if-Bedingung zutrifft);
  • if-(else-)Anweisung statt if-(else-)statement;
  • etc.

Schau dir das folgende Video an.

Video "Verschachtelte if-statements und elif"

Zustände des Programms aus dem Video:

(1) mit verschachtelten if-statements:

(1) mit verschachtelten if-statements:

tageslicht-verschachtelt.py
t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 
if t >= 120:
    print("Prima!")
    print("Deine Augen werden es dir langfristig danken.")
else:
    if t < 0:
        print("Das kommt mir etwas kurz vor!")
    else:
        print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
print("Programmende")

</code>

(2) dasselbe verkürzt mit “elif” als Verschmelzung von “else if”

(2) dasselbe verkürzt mit “elif” als Verschmelzung von “else if”

tageslicht-elif.py
t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 
if t >= 120:
    print("Prima!")
    print("Deine Augen werden es dir langfristig danken.")
elif t < 0:
    print("Das kommt mir etwas kurz vor!")
else:
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
print("Programmende")

(3) mit verfeinerter Fallunterscheidung

(3) mit verfeinerter Fallunterscheidung

tageslicht-elif-verfeinert.py
t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 
if t >= 120:
    print("Prima!")
    print("Deine Augen werden es dir langfristig danken.")
elif t < 0:
    print("Das kommt mir etwas kurz vor!")
elif t > 90:
    print("Du bist auf einem guten Weg.")
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
else:
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
print("Programmende")

(4) dasselbe nur mit if; möglich, aber nicht empfohlen und fehleranfälliger

(4) dasselbe nur mit if; möglich, aber nicht empfohlen und fehleranfälliger

tageslicht-naiv-per-if.py
t = int(input("Wie viele Minuten Tageslicht hattest du heute bereits? "))
 
if t >= 120:
    print("Prima!")
    print("Deine Augen werden es dir langfristig danken.")
if t < 0:
    print("Das kommt mir etwas kurz vor!")
if t > 90 and t < 120:
    print("Du bist auf einem guten Weg.")
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
if 0 <= t <= 90:
    print("Versuche bitte im eigenen Interesse, noch mindestens " + str(120 - t) + " Minuten draussen zu verbringen.")
print("Programmende")

(1) Schreibe ein Programm

  • mit verschachtelten if-else-statements (und nicht 5 verschiedenen if-statements),

das vom Benutzer eine Temperaturangabe einliest und dann mitteilt, ob es kalt oder kühl oder behaglich oder warm oder heiss ist. In welchem Temperaturbereich welches Temperaturempfinden eintritt, ist dir überlassen.

Bemerkung: Es gibt viele Möglichkeiten der Verschachtelung. Wenn du willst, kannst du mehrere finden.

(2) Ändere dein Programm nun so, dass du alle else-if-Kombinationen zu elifs verschmilzt!

(3) Teste dein Programm: Für jeden Temperaturbereich ist mindestens ein Test durchzuführen.

Lösungsvorschlag mit verschachtelten if-else-statements (drei Varianten in einem Programm)

Lösungsvorschlag mit verschachtelten if-else-statements (drei Varianten in einem Programm)

temperatur-verschachtelt.py
temperatur = int(input("Wie warm ist es? "))
 
# Es gibt viele Möglichkeiten, die je nach Geschmack 
# unterschiedlich elegant (bzw. sogar recht chaotisch) 
# wirken. Ich gebe drei relativ systematische Möglichkeiten an:
 
# 1. Möglichkeit (von oben her Rantasten):
 
if temperatur >= 35:
    print("Es ist heiss.")
else:
    if temperatur >= 25:
        print("Es ist warm.")
    else:
        if temperatur >= 15:
            print("Es ist behaglich.")
        else:
            if temperatur >= 5:
                print("Es ist kühl.")
            else:
                print("Es ist kalt.")
 
# 2. Möglichkeit (etwa in der Mitte spalten):
 
if temperatur < 15:
    if temperatur < 5:
        print("Es ist kalt.")
    else:
        print("Es ist kühl.")
else:
    if temperatur < 35:
        if temperatur < 25:
            print("Es ist behaglich.")
        else:
            print("Es ist warm.")
    else:
        print("Es ist heiss.")
 
# 3. Möglichkeit (wohl nicht so naheliegend):
 
if temperatur < 35:
    if temperatur < 25:
        if temperatur < 15:
            if temperatur < 5:
                print("Es ist kalt.")
            else:
                print("Es ist kühl.")
        else: 
            print("Es ist behaglich.")
    else:
        print("Es ist warm.")
else:
    print("Es ist heiss.")

… und nun mit allen else+if zu elif verschmolzen

… und nun mit allen else+if zu elif verschmolzen

temperatur-mit-elif
temperatur = int(input("Wie warm ist es? "))
 
# 1. Möglichkeit, eignet sich am besten zum Verschmelzen:
 
if temperatur >= 35:
    print("Es ist heiss.")
elif temperatur >= 25:
    print("Es ist warm.")
elif temperatur >= 15:
    print("Es ist behaglich.")
elif temperatur >= 5:
    print("Es ist kühl.")
else:
    print("Es ist kalt.")
 
# 2. Möglichkeit, nur eine Verschmelzung möglich:
 
if temperatur < 15:
    if temperatur < 5:
        print("Es ist kalt.")
    else:
        print("Es ist kühl.")
elif temperatur < 35:
    if temperatur < 25:
        print("Es ist behaglich.")
    else:
        print("Es ist warm.")
else:
    print("Es ist heiss.")
 
# 3. Möglichkeit, keine Verschmelzung möglich:
 
if temperatur < 35:
    if temperatur < 25:
        if temperatur < 15:
            if temperatur < 5:
                print("Es ist kalt.")
            else:
                print("Es ist kühl.")
        else: 
            print("Es ist behaglich.")
    else:
        print("Es ist warm.")
else:
    print("Es ist heiss.")

(1) Schreibe ein Programm, dass vom Benutzer zwei Zahlen $a$ und $b$ einliest. Das Programm soll ausgegeben, wie viele Lösungen die lineare Gleichung $ax+b=0$ hat. Danach sollen alle Lösungen ausgegeben werden.

Alle Spezialfälle sind zu behandeln (denke an Fälle wie $0X+2=0$ und $0X+0=0$).

Hinweis, falls dir die Mathematik Probleme macht:

Hinweis, falls dir die Mathematik Probleme macht:

Die Fallunterscheidung in der Mathematik (und dann auch in deinem Python-Programm) geht so:

  • Im Fall $a \not=0$ hat die Gleichung genau eine Lösung, nämlich $x=-\frac{b}{a}$.
  • Sonst (also im Fall $a=0$) gilt: (Die Gleichung hat dann die Gestalt $0x+b=0$.)
    • Im Fall $b\not= 0$ hat die Gleichung keine Lösung, also Lösungsmenge $\mathbb{L} = \emptyset$.
    • Sonst (also im Fall $b = 0$) hat die Gleichung jede reelle Zahl als Lösung, also Lösungsmenge $\mathbb{L} = \mathbb{R}$.

Als Ausgabe musst du nicht diese mathematischen Symbole verwenden, sondern kannst einfach die Lösungsmenge per Text beschreiben.


(2) Teste dein Programm!

Lösungsvorschlag

Lösungsvorschlag

lineare-gleichung-loesen.py
print("Lösungsprogramm für lineare Gleichunge der Gestalt ax+b=0.")
a = int(input("Wert von a: "))
b = int(input("Wert von b: "))
 
if a != 0:
    print("Die Gleichung hat genau eine Lösung, nämlich " + str(-b/a) + ".")
elif b!= 0:
    print("Die Gleichung hat keine Lösung.")
else:
    print("Die Gleichung hat jede reelle Zahl als Lösung.")

Schau, was du auf

https://www.w3schools.com/python/python_conditions.asp

zusätzlich zu if-statements lernen kannst. (Fehlt hier etwas Wichtiges?)

Dort kannst du auch viele Beispiele direkt im Browser ausprobieren. Finde heraus, wie das geht!

Bearbeite die Übungen am Ende der Seite.

Stell dir selbst ein Problem, das du mit den bereits vorhandenen Programmierkenntnissen lösen kannst.

Wenn du es mir mitteilst und es mir gefällt, nehme ich es gerne (je nach Wunsch mit oder ohne Angabe des Autors bzw. der Autorin) in diesen Kurs auf!

  • lehrkraefte/snr/informatik/glf22/python/if-else.txt
  • Last modified: 2022/12/01 18:39
  • by Olaf Schnürer