Schleifen

Die Beispiele aus diesem Abschnitt können in einem Jupyternotebook nachvollzogen werden. Es muss zusammen mit den Bilddateien vorher entpackt werden.

Notebook Schleifen

Danach kann man das Notebook zusammen mit den Bildern z.B. bei https://jupyter.org/try → JupyterLab hochladen und öffnen.

Häufig wiederholen sich Anweisungen in Algorithmen. Solche Anweisungen lassen sich in der Datenstruktur Schleife zusammenfassen. Die Frage ist nun, wie oft die Anweisungen wiederholt werden sollen. Auf diese Frage gibt es mehrere Antworten:

Schleifen mit Abbruchbedingung

Kopfgesteuerte Schleife Wiederhole solange die Bedingung erfüllt ist: …Anweisungen… Bei der kopfgesteuerten Schleife wird die Schleifenbedingung am Anfang der Schleife getestet. Die Schleife wird immer wieder durchlaufen, solange die Bedingung erfüllt ist. Wenn die Bedingung beim Eintritt nicht erfüllt, wird die Schleife nicht durchlaufen. Struktogramm	Fußgesteuerte Schleife Wiederhole: …Anweisungen… solange die Bedingung erfüllt ist Bei der fußgesteuerten Schleife wird die Schleifenbedingung am Ende der Schleife getestet. Die Schleife wird immer wieder durchlaufen, solange die Bedingung erfüllt ist. Wenn die Bedingung beim Eintritt nicht erfüllt, wird die Schleife mindestens einmal durchlaufen. Struktogramm

Schleifen mit Abbruchbedingung in Python

In Python wird eine kopfgesteuerte Schleife mit der while-Anweisung umgesetzt. Für fußgesteuerte Schleifen gibt es keine eigene Anweisung, es gibt aber mehrere Möglichkeiten, eine fußgesteuerte Schleife zu simmulieren. Widmen wir uns aber zunächst der while-Anweisung und ihrer Syntax:

while Bedingung: ... Anweisungen ...

Nach while steht die Bedingung, gefolgt von einem Doppelpunkt. Solange die Bedingung erfüllt ist, wird die Schleife durchlaufen. Wir müssen also in der Schleife dafür sorgen, dass die Bedingung irgendwann nicht erfüllt ist, sonst haben wir eine Endlosschleife.

Beispiel 1

Erstelle ein Programm, welches nach Eingabe einer ganzen Zahl die Quadratzahl berechnet. Nach jeder Berechnung soll gefragt werden ob das Programm fortgesetzt erden soll. Bei Eingabe von „Nein“ wird das Programm beendet.

# Die Variable eingabe muss initialisiert werden, sonst kommt es beim Eintritt in die Schleife zur Fehlermeldung eingabe = "" while eingabe != "N": zahl = int(input("Zahl: ")) print("Quadratzahl:",zahl*zahl) eingabe = input("Soll das Programm fortgesetzt werden? (J|N)")

Schleife mit Zähler

m Unterschied zu fuß- und kopfgesteuerten Schleifen steht bei Zählschleifen die Anzahl der Durchläufe vor dem Schleifeneintritt fest. Dabei nimmt eine sogenannte Zählvariable während des Schleifendurchlaufs eine endliche Anzahl von fest definierten Werten an.

In verbaler Kurzform lässt sich der Algorithmus wie folgt formulieren:

Für Startwert bis Endwert mit Schrittweite führe aus: …Anweisungen…

Struktogramm

Zählschleifen in Python

In Python kann man eine Zählschleife mit Hilfe der for- und der range-Anweisung umsetzen. Die range-Anweisung erzeugt dabei die Werte, die die Zählvariable durchlaufen soll. Sie besitzt den folgenden Aufbau:

range (Startwert, Endwert, Schrittweite)

Startwert und Schrittweite können weggelassen werden. Es wird dann angenommen, dass der Startwert den Wert 0 hat und die Schrittweite den Wert 1 hat. Fehlt nur ein Parameter, so wird angenommen, dass die Schrittweite fehlt. range erzeugt nun eine Folge von Werten, die mit dem Startwert beginnt. Der jeweils nächste Wert ergibt sich, indem man zu einem Wert die Schrittweite addiert. Das wird wird immer weiter fortgesetzt, solange ein Wert noch keiner ist als der Endwert.

Hier einige Beispiele. In den Beispielen wird die Ausgabe von range in eine Liste umgewandelt. Zu Listen erfährst du weiter unten mehr.

print(list(range(1,9,3))) print(list(range(1,10))) print(list(range(8)))

Ausgabe des Programms:

[1, 4, 7] [1, 2, 3, 4, 5, 6, 7, 8, 9] [0, 1, 2, 3, 4, 5, 6, 7]

Im Zusammenhang mit einer sogenannten for-Schleife benutzt man range nun wie folgt:

for i in range(Startwert, Endwert, Schrittweite): ... Anweisungen ...

Die Variable i nimmt nun bei jeden Schleifendurchlauf einen von range erzeugten Wert an. Man kann nun i mit dem jeweiligen Wert in der Schleife benutzen oder man benutzt das Konstrukt einfach, um die Anzahl der Durchläufe festzulegen.

Beispiel 2

Schreibe ein Programm, welches eine Liste der Quadratzahlen bis 20 ausgibt.

Struktogramm

Lösung

# Beispiel 2 print("Zahl","Quadratzahl") for i in range(1,21): print(i,"\t",i*i)

Die for-Anweisung und Listen

Bereits weiter oben habe ich den Datentyp Liste erwähnt. Listen gehören in Python zu den zusammengesetzten Datentypen. Eine Liste kann man sich als einen Behälter für mehrere Werte vorstellen. Diese Werte können unterschiedliche Datentypen haben Sie können sogar selbst wieder Listen sein. Listen erkennt man in Python durch eckige Klammern. In den Klammern werden die Werte durch ein Komma getrennt.

Beispiel 3

[1,23,7,4] ["Hallo",4,34.2,True]

In der ersten Liste sind nur ganze Zahlen als Werte enthalten. In der zweiten Liste stehen Werte unterschiedlicher Datentypen.

Eine Liste kann man mit dem Zuweisungsoperator = erzeugen.

Beispiel 4

liste1 = [1,23,7,4] liste2=["Glauchau","Meerane","Waldenburg", "Mülsen", "Thurm"] liste3=[[1,2,3],[4,5,6],[7,8,9]] liste4=[] #leere Liste

Auch das Anlegen einer leeren Liste kann sinnvoll sein, wenn man durch Anhängen von weiteren Listenelementen eine Liste aufbauen will.

Beispiel 5

Wir betrachten die Liste

liste1=[1,23,21,23,12]

Die gesamte Liste lässt sich mit Hilfe der print-Anweisung ausgeben:

print(liste1)

Ausgabe:

[1, 23, 21, 23, 12]

Auf einzelne Listenelemente kann man durch Angabe der Nummer (den Index) des Listenelements zugreifen. Die Nummer steht dabei nach dem Listennamen in eckigen Klammern. Die Zählung beginnt bei 0.

print(liste1[2])

Ausgabe:

21

Listen sind in Python ein sogenannte abzählbarer (itterierbarer) Datentyp. Neben Listen gibt es in Python noch weitere solche Datentypen (z.B. Tupel). Mit der for-Anweisung kann man nun ohne die Verwendung von range eine Schleife über alle Elemente eines solchen Datentyps laufen lassen.

Beispiel 6

liste = [3, 5.5, "Python ist cool!", False] for wert in liste: print(wert)

Endlosschleifen

Wenn ich im Schleifenkopf schreibe

while True: ... Anweisungen ...

ist die Schleifenbedingung immer erfüllt und die Schleife endet nie. Es entsteht eine Endlosschleife. Diese widerspricht eigentlich der Algorithmeneigenschaft Endlichkeit.

Es gibt aber Möglichkeiten, wie man eine solche Schleife anders beenden kann:

Die Anweisung break beendet eine Schleife. Die Anweisung continue beendet den aktuellen Schleifendurchlauf und beginnt mit dem nächsten.

Beispiel 7

while True: zahl = int(input("Zahl: ")) print("Quadratzahl:",zahl*zahl) eingabe = input("Soll das Programm fortgesetzt werden? (J|N)") if eingabe == 'N': break

Übungen

Im folgenden Jupyternotebook finden sich einige Übungsaufgaben zum Thema.

Übungen