-
Notifications
You must be signed in to change notification settings - Fork 1
05 Kontrollstrukturen
Mit Kontrollstrukturen wird der Programmablauf über Wiederholungen und Verzweigungen gesteuert.
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.
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
bish
- Die Zeilen sind numerisch absteigend von
8
bis1
Tipp:
- alle Buchstaben des Alphabets erhältst du z.B. so:
abc = string.ascii_lowercase
- nutze z.B.
sorted
mitreverse=True
für absteigende SortierungBeispiel:
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.
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.
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 ==
.
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.
Finde mehr interaktive Beispiele zu den meisten Kapiteln als Python Notebook.