In diesem Level werden wir lernen, wie die Ausführung von bestimmten Code an Bedingungen knüpfen. Dafür werden wir erst den Typ des boolean und im Anschluss unsere ersten Kontrollstrukturen, die if-Bedingung und die while-Schleife einführen. Dabei werden wir die Schlüsselwörter True
, False
, if
, elif
, else
, is
, while
, break
und continue
kennenlernen.
Die if-Bedingung wird es uns ermöglichen Code auszuführen, wenn eine Bedingung erfüllt ist. Die while-Schleife wird es uns ermöglichen Code solange auszuführen, wie eine Bedingung erfüllt ist.
In [1]:
eingabe = input("Bitte etwas eingeben: ")
zahl = int(eingabe)
print(zahl)
Schauen wir uns obigen Code an. Wir erwarten eine Eingabe und versuchen aus dieser Eingabe einen integer zu entnehmen. Dies klappt auch, wenn der Benutzer eine ganze Zahl eingibt - gibt er jedoch stattdessen zum Beispiel eine Zeichenkette ein, wird ein ValueError
geworfen. Ebenso wird ein Fehler geworfen, wenn der Benutzer nichts eingibt.
Im Verlauf dieses Levels werden wir, lernen Benutzereingaben zu prüfen und entsprechend zu reagieren.
In [2]:
b1 = True
b2 = False
print(type(b1))
print(type(b2))
Der Typ eines Objektes bestimmt, wie dieses in einen boolean umgewandelt wird. Für die bisherigen Typen integer, float und string gilt:
True
, solange er nicht 0
istTrue
, solange er nicht 0.0
istTrue
, solange er nicht leer, d.h. ''
ist
In [3]:
print(bool(""))
print(bool(0))
print(bool(0.0))
Genauso wie integer und floats gibt es auch für booleans Operatoren:
and
das logische "und"or
das logische "oder"not
die logische NegationAußerdem lässt sich auch xor (^
) auf booleans anwenden.
In [4]:
print("not True:", not True)
print("True or False:", True or False)
print("True and False:", True and False)
print("True ^ False:", True ^ False)
Häufig möchte man Werte mit einander vergleichen, dafür gibt es die Vergleichsoperatoren, die für viele Typen definiert sind:
==
: prüft auf Äquivalenz!=
: prüft auf Nicht-Äquivalenz>
: echtes größer<
: echtes kleiner>=
: größer gleich<=
: kleiner gleichis
: prüft auf GleichheitDiese Operatoren liefern alle einen boolschen Wert, d.h. einen Wert vom Typ boolean zurück.
In [5]:
print(5 < 3)
In [6]:
print("==:", 10**3 == 1000)
print("is:", 10**3 is 1000)
Nun da wir gelernt haben, was boolean-Werte sind, können wir diese in einer if-Abfrage benutzen: Codeteile nur dann ausführen, wenn eine Bedingung erfüllt ist. Sehen wir uns zunächst die Syntax einer if-Abfrage in Python an:
if Bedingung:
Befehle
Wir starten mit dem Schlüsselwort if
, dann kommt eine Bedingung, diese sollte einen boolschen Ausdruck zurückgeben, wir können diesen explizit angeben, der Interpreter ruft allerdings auf unsere Bedingung bool()
auf und führt unsere Befehle aus, wenn dies True
zurück gibt. Nach der Bedingung folgt ein Doppelpunkt :
. Die nächste Zeile wird nun eingerückt, hierbei hat man sich auf vier Leerzeichen geeinigt.
In [7]:
eingabe = input("Bitte etwas eingeben: ")
if eingabe: # alternativ: bool(eingabe) oder eingabe != ""
print(eingabe)
Im obigen Codebeispiel prüft die if-Bedingung, ob der String eingabe
leer ist. Dies geschieht implizit, d.h. es wird ausgenutzt, dass der Interpreter die Bedingung in einen boolean umwandelt. In dem Kommentar sind alternative Bedingungen beschrieben, die daselbe erreichen, allerdings umständlicher sind.
Wenn wir uns aber an unser Problem aus der Einleitung erinnern, war unser Ziel eine Zahl aus der Eingabe zu lesen und Fehler durch falsche Benutzereingaben abzufangen. Wir wollen also darauf reagieren, wenn nichts eingegeben wurde, wenn eine Zahl eingegeben wurde und wenn eine Zeichenkette eingegeben wurde, die nicht als integer interpretiert werden kann.
In [8]:
eingabe = input("Bitte etwas eingeben: ")
if eingabe.isdigit():
zahl = int(eingabe)
print(zahl)
else:
print("Ungültige Eingabe:", eingabe)
Wie wir sehen können, passiert im obigen Codebeispiel eine Menge auf einmal, gehen wir es also in Ruhe durch.
In der if-Abfrage wird mit der str.isdigit()
Methode geprüft, ob der string eingabe
nicht leer ist und nur aus Ziffern besteht; wenn dem so ist, erstellen wir einen integer zahl
aus der Eingabe und geben diesen aus. In einem else
Zweig, der ausgeführt wird, wenn die Bedingung der if-Abfrage nicht zutraf, geben wir dem Benutzer Feedback über seine falsche Eingabe zurück.
In [9]:
eingabe = input("Bitte eine Zahl eingeben: ")
if eingabe:
# die Eingabe ist nicht leer.
if eingabe.isdigit():
zahl = int(eingabe)
print(zahl, "ist eine gültige Zahl.")
else:
print("Die Eingabe ''" + eingabe + "' ist keine gültige Zahl")
else:
print("Die Eingabe ist leer.")
if-Bedingungen können auch verschachtelt werden, d.h. wir können also in einer if-Bedingung eine weitere if-Bedingung definieren. Allerdings können wir dies durch die Benutzung des Schlüsselwortes elif
vereinfachen:
In [10]:
eingabe = input("Bitte eine Zahl eingeben: ")
if eingabe.isdigit():
# die Eingabe ist eine gültige Zahl
zahl = int(eingabe)
print(zahl, "ist eine gültige Zahl.")
elif not eingabe:
# die Eingabe ist leer
print("Die Eingabe ist leer")
else:
# die Eingabe ist nicht leer, aber auch keine
# gültige Zahl
print("Die Eingabe '" + eingabe + "' ist keine gültige Zahl")
Eine if-Bedingung enthält einen if-Zweig, beliebig viele optionale elif-Zweige und optional einen else-Zweig. Dabei wird immer der erste Zweig, dessen Bedingung zutrifft ausgeführt und nachher keine weiteren. Daher ist es wichtig auf die Reihenfolge der Zweige zu achten.
Bisher ist es sehr schwierig Code mehrfach auszuführen, wenn wir unsere Programme wiederholen müssen wir sie neu starten. Nicht nur das, sondern haben wir keine Möglichkeit Befehle beliebig häufig auszuführen. Die Möglichkeit Code wiederholt auszuführen ist allerdings für viele Programme ein elementarer Bestandteil. Daher möchten wir uns im dritten Abschnitt dieses Levels mit der while-Schleife beschäftigen, die diese Probleme löst.
Die while-Schleife ist im Aufbau ähnlich der if-Bedingung:
while Bedingung:
Befehle
Der Unterschied ist, dass unsere Befehle, solange wiederholt werden, wie die Bedingung gültig (d.h. == True) ist. Hierbei ist Vorsicht geboten, da es zu Endlosschleifen kommen kann.
In [11]:
counter = 0
while counter < 10:
print(counter)
counter += 1
Im obigen Codeblock sehen wir eine einfache Anwendung der while-Schleife. Kommentieren wir jedoch die letzte Zeile aus, kommt es zu einer Endlosschleife. In diesem Zusammenhang der Hinweis, dass sich im Interpreter Python Programme durch drücken von Strg + C abbrechen lassen.
Innerhalb einer while-Schleife ist es möglich mit dem Schlüsselwort break
den Durchlauf der Schleife abzubrechen oder mit dem Schlüsselwort continue
den aktuellen Durchlauf zu überspringen. Bei der Benutzung von continue
müssen wir wieder darauf achten keine Endlosschleifen zu erstellen.
In [2]:
print("Start.")
while True:
eingabe = input("Bitte etwas eingeben: ")
if not eingabe:
break
elif eingabe == "Q":
break
elif eingabe == "C":
continue
else:
print(eingabe)
print(len(eingabe)*"-")
print("Fertig.")
Das Schlüsselwort else
kann nicht nur in einer if-Bedingung, sonder auch in Verbindung mit einer while-Schleife benutzt werden. Dabei wird der else-Zweig ans Ende der entsprechenden while-Schleife angefügt. Der Code des else-Zweiges wird dann nur ausgeführt, wenn die Schleife nicht durch ein break
abgebrochen wurde.
In [4]:
# Zahlen raten
gesucht = 56
versuche = 10
zähler = 0
print("Die gesuchte Zahl x ist 0 < x < 100.")
while zähler < versuche:
eingabe = input(": ")
zähler += 1
# eingabe überprüfen
if eingabe.isdigit():
zahl = int(eingabe)
else:
print("Ungültige Eingabe.")
continue
# Benutzer Feedback
if zahl == gesucht:
print("Richtig!")
break
else:
if zahl > gesucht:
print("Kleiner.")
else:
print("Größer")
print("Noch", versuche-zähler, "Versuche.")
else:
# kein break <=> zahl wurde nicht erraten
print("Die Zahl wurde nicht erraten.")
print("Die richtige Zahl war:", gesucht)
Vor diesem Level konnten wir nur sehr begrenzte Programme schreiben. Wir konnten Eingaben entgegennehmen, mit dieser Eingabe Berechnungen (im weitesten Sinne) durchführen und die Ergebnisse dieser Berechnungen wieder ausgeben. Dieses Level hat nun die if-Bedingung und die while-Schleife eingeführt. Diese beiden Kontrollstrukturen ermöglichen uns das Schreiben komplexer Programme und die Implementation anspruchsvoller Algorithmen. die if-Bedingung sorgt dafür, dass unsere Programme nun auf Eingaben zu reagieren und Fehler abzufangen. Die while-Schleife ermöglicht es uns Befehle beliebig häufig auszuführen. Damit sind schon im zweiten Level wichtige Bausteine für komplexe Programme eingeführt worden.