Level 2

Einstieg

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)


Bitte etwas eingeben: 3
3

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.

Der Typ boolean

Der boolean ist ein Typ, der genau zwei Werte besitzt: True und False. In Python3 sind diese beiden Literale Schlüsselwörter und können somit nicht als Variablennamen benutzt werden. Mit der bool()Funktion kann ein Wert in einen boolean umgewandelt werden.


In [2]:
b1 = True
b2 = False
print(type(b1))
print(type(b2))


<class 'bool'>
<class 'bool'>

Der Typ eines Objektes bestimmt, wie dieses in einen boolean umgewandelt wird. Für die bisherigen Typen integer, float und string gilt:

  • ein integer ist True, solange er nicht 0 ist
  • ein float ist True, solange er nicht 0.0 ist
  • ein string ist True, solange er nicht leer, d.h. '' ist

In [3]:
print(bool(""))
print(bool(0))
print(bool(0.0))


False
False
False

Genauso wie integer und floats gibt es auch für booleans Operatoren:

  • and das logische "und"
  • or das logische "oder"
  • not die logische Negation

Auß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)


not True: False
True or False: True
True and False: False
True ^ False: True

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 gleich
  • is: prüft auf Gleichheit

Diese Operatoren liefern alle einen boolschen Wert, d.h. einen Wert vom Typ boolean zurück.


In [5]:
print(5 < 3)


False

"==" und "is"

== prüft, ob die Objekte, auf die die Variablen zeigen, äquivalent sind.
is prüft, ob die Variablen auf dasselbe Objekt zeigen.


In [6]:
print("==:", 10**3 == 1000)
print("is:", 10**3 is 1000)


==: True
is: False

if-Bedingung

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 Truezurü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)


Bitte etwas eingeben: 3
3

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)


Bitte etwas eingeben: 3
3

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.")


Bitte eine Zahl eingeben: 3
3 ist eine gültige Zahl.

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")


Bitte eine Zahl eingeben: 3
3 ist eine 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.

while-Schleife

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


0
1
2
3
4
5
6
7
8
9

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 continuemü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.")


Start.
Bitte etwas eingeben: Hallo
Hallo
-----
Bitte etwas eingeben: C
Bitte etwas eingeben: Q
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)


Die gesuchte Zahl x ist 0 < x < 100.
: 50
Größer
Noch 9 Versuche.
: 75
Kleiner.
Noch 8 Versuche.
: 62
Kleiner.
Noch 7 Versuche.
: 56
Richtig!

Rückblick

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.