Skip to content

05 Kontrollstrukturen

Juergen Hansmann edited this page Mar 14, 2023 · 4 revisions

Kontrollstrukturen

Mit Kontrollstrukturen wird der Programmablauf über Wiederholungen und Verzweigungen gesteuert.

Wiederholungen

Schleifen (loops) erlauben, Listen effizient abzuarbeiten. Beim sogenannten Iterieren wird eine bestimmte Operation für jedes Element in einer Liste einmal ausgeführt.

liste = [1, 2, 3, 4, 5]
for zahl in liste:
    quadratzahl = zahl ** 2
    print(quadratzahl)

Im Beispiel wird bei jedem Schleifendurchlauf die Quadratzahl der aktuellen Zahl berechnet und angezeigt, bis alle Zahlen aus der Liste einmal an der Reihe waren.


Den eingerückten Codeabschnitt nennt man Anweisungsblock. Dieser ist immer genau vier Leerschläge eingerückt.
Python ist hier sehr strikt und verzeiht es nicht, wenn diese Regel nicht eingehalten wird. Zum Glück unterstützt uns hier die IDE.


for-Schleifen

Das Beispiel oben nennt man for-Schleife, da der Schleifendurchlauf für eine bestimmte Anzahl Elemente ausgeführt wird.
Die Anzahl Elemente ergibt sich aus der Listenlänge.

Übung: Pyramide
pyramide.py

  • Versuche mit möglichst wenig Code folgende Muster auf dem Bildschirm anzuzeigen
  • Nutze z.B. 'X' * 2 um das X zu vervielfachen
  • Falls benötigt, ist \n ein Zeilenumbruch
  • Versuche, die Höhe der Pyramiden über eine Variable festzulegen
X
XX
XXX
XXXX
XXXXX
    X
   XX
  XXX
 XXXX
XXXXX
    X
   XXX
  XXXXX
 XXXXXXX
XXXXXXXXX

Übung: Schachbrett
schach.py

  • Versuche, die Bezeichnung der einzelnen Felder eines Schachbretts auf dem Bildschirm anzuzeigen

Achtung:

  • Die Spalten sind alphabetisch aufsteigend von a bis h
  • Die Zeilen sind numerisch absteigend von 8 bis 1

Tipp:

  • alle Buchstaben des Alphabets erhältst du z.B. so: abc = string.ascii_lowercase
  • nutze z.B. sorted mit reverse=True für absteigende Sortierung

Beispiel:

a8 b8 c8 d8 e8 f8 g8 h8 
a7 b7 c7 d7 e7 f7 g7 h7
a6 b6 c6 d6 e6 f6 g6 h6
a5 b5 c5 d5 e5 f5 g5 h5
a4 b4 c4 d4 e4 f4 g4 h4
a3 b3 c3 d3 e3 f3 g3 h3
a2 b2 c2 d2 e2 f2 g2 h2
a1 b1 c1 d1 e1 f1 g1 h1

Übung: Summe
summe.py

Berechne mit einer for-Schleife die Summe der Elemente in der Liste [1, 2, 3, 4, 5, 6].

Tipp:
Innerhalb eines Anweisungsblocks können wir auf Variablen von ausserhalb des Blocks zugreifen und diese verändern. Dazu wird eine Variable vor dem Block initialisiert (z.B. summe = 0) und dieser Wert bei jedem Schleifendurchlauf um die aktuelle Zahl erhöht.

while-Schleife

Häufig gibt es auch den Fall, dass wir zu Beginn nicht genau wissen, wie oft eine Anweisung ausgeführt werden soll. Die Anzahl Durchläufe hängt dann von einer Bedingung ab.

zahl = 1
while zahl <= 10:
    print(zahl)
    zahl += 0.0123456
print("Schleife fertig")

Eine while-Schleife wird ausgeführt, solange eine Bedingung erfüllt ist. Danach geht es im Skript ausserhalb des Anweisungsblocks weiter.


while-Schleifen sind sehr anfällig für Programmierfehler. Wenn nämlich das Abbruchkriterium fehlt, bleibt das Skript im Block gefangen und befindet sich in einer Endlos-Schleife.
Abgebrochen werden kann eine Endlos-Schleife mit Ctrl+C.
Hier wäre der richtige Ort, uns nochmals dem Thema Debugging zuzuwenden


Übung: Debugging
debugging.py

Lege eine Datei mit dem Namen debugging.py an und kopiere den folgenden Code hinein:

zahl = 1

while zahl <= 10:
   zahl = zahl - 0.0123456

print("Schleife fertig") 

Wenn man das Script ausführt, hängt es in einer Endlosschleife fest. In diesem Fall ist es recht offensichtlich, woran das liegt. Aber in komplexeren Scripts würde hier der Debugger helfen. Wenn man z.B. den Verdacht hat, dass das Abbruchkriterium einer Schleife nie erreicht wird, kann man einen Breakpoint innerhalb der Schleife setzen. So können wir beispielsweise den Wert der Variablen "zahl" in jedem Schleifendurchlauf beobachten. Um einen Breakpoint zu setzen, die Maus links neben der Zeilennummer bewegen. Es erscheint ein schwach roter Punkt. Wenn man ihn anklickt, wird er hellrot und bleibt fix neben der Zeile. Dieser rote Punkt bedeutet, dass in dieser Zeile die Ausführung des Codes gestoppt wird und man die aktuellen Variablenwerte anschauen kann, bevor der Code weiter ausgeführt wird. Wenn ein Breakpoint innerhalb einer Schleife gesetzt ist, wird der Code bei jedem Schleifendurchlauf an der Stelle unterbrochen, so dass man die aktuellen Variablenwerte anschauen kann.

Verzweigungen

Die Prüfung, ob eine Bedingung erfüllt ist oder nicht, ist einer der wichtigsten Mechanismen bei der Programmierung. Damit werden die Weichen gestellt, was das Programm unter gewissen Umständen tun soll.

Verzweigungen werden mit if, elif und else gesteuert. Es ist erlaubt, dass if alleine steht und keine weiteren Prüfungen stattfinden sollen. Beliebig viele alternative Bedingungen können mit elif geprüft werden. Falls bis dahin noch keine der Bedingungen erfüllt wurde, wird der Anweisungsblock nach else ausgeführt.

for zahl in range(10):
    if zahl == 3:
        print(zahl, "juhee, drei")
    elif zahl == 7:
        print(zahl, "yepee, sieben")
    elif zahl == 9:
        print(zahl, "yes, neun")
    else:
        print(zahl, "eine andere Zahl")

range(10) ist eine Kurzschreibweise für eine Liste [0,1,2,3,4,5,6,7,8,9]. Auch hier gilt wieder: Die Nummerierung beginnt bei 0, dafür ist die 10 nicht inklusive.
Im Gegensatz zur Initialisierung einer Variablen = besteht der Vergleichsoperator aus zwei Gleichheitszeichen ==.

Vergleichsoperatoren

Neben dem ist-gleich-Operator gibt es zahlreiche weitere Vergleichsoperatoren:

Operator Bedeutung Beispiel
== ist gleich "a" == "b"
!= ist ungleich "a" != "b"
< ist kleiner als 1 < 2
<= ist kleiner gleich 2 <= 2
> ist grösser als 1 > 2
>= ist grösser gleich 4 >= 3
in ist in einer Collection enthalten "e" in "Hello"
7 in range(10)
"a" in ["b","c","d"]

Das Resultat eines Vergleichs ist immer entweder True oder False. Diese Booleans sind im Code häufig nicht direkt als solche ersichtlich, sondern verstecken sich hinter der eigentlichen Expression.

Artverwandt sind spezielle Funktionen, die als Resultat einen Boolean zurückgeben:

Funktion Bedeutung Beispiel
.startswith() String beginnt mit "Hello".startswith("h")
.endswith() String endet mit "World".endwith("d")

Die verschiedenen Vergleichsoperatoren lassen sich beliebig kombinieren oder negieren. Dazu werden die Befehle and, or und not verwendet. Einzelne Bedingungen können mit Klammern gruppiert werden.

Bei einer Kombination von Schleifen und Bedingungen kann der Schleifendurchlauf mit dem Befehl break aktiv unterbrochen werden.

zahl = 1
while zahl <= 10:
    print(zahl)
    if zahl == 5:
        print("Abbruchkriterium erfuellt")
        break
    zahl += 1
print("Schleife fertig")

Artverwandt ist der Befehl continue. Damit werden allfällige restliche Befehle im Anweisungsblock übersprungen, und die Schleife startet mit dem nächsten Element von vorne neu.