Teil 7: Schleifen

Lernziele
  • Mit for und range eine feste Anzahl Durchläufe programmieren
  • Start, Ende und Schrittweite von range richtig setzen
  • Schleifen verschachteln und den Unterschied zwischen innen und aussen erklären
  • Mit while wiederholen, solange eine Bedingung gilt
  • Eine Schleife mit break verlassen und mit continue einen Durchlauf überspringen

Neue Befehle und Zeichen:

  • for wiederholt für jeden Wert einer Folge
  • range() erzeugt eine Folge von Zahlen
  • while wiederholt, solange eine Bedingung wahr ist
  • break bricht die Schleife ab
  • continue springt zum nächsten Durchlauf
  • += erhöht eine Variable um einen Wert

Die Turtle

Schleifen üben wir in diesem Teil mit einer Schildkröte, die zeichnen kann. Die Turtle startet in der Mitte der Zeichenfläche, schaut nach rechts und zieht eine Linie hinter sich her, wo immer sie hinläuft. Klicken Sie auf Run:

PythonLoading editor…
import turtle
eva = turtle.Turtle()

eva.forward(100)
eva.left(90)
eva.forward(50)

Die ersten beiden Zeilen braucht jedes Turtle-Programm: import turtle lädt die Turtle, und eva = turtle.Turtle() erzeugt eine Schildkröte mit dem Namen eva. Alle Befehle an sie beginnen mit eva.. Mehr als diese Befehle brauchen Sie nicht. Die Karte bleibt beim Scrollen am rechten Rand angepinnt:

Turtle-Befehle

BefehlWirkung
eva.forward(100)100 Schritte vorwärts
eva.back(100)100 Schritte rückwärts
eva.left(90)um 90° nach links drehen
eva.right(90)um 90° nach rechts drehen
eva.penup()Stift anheben: eva läuft, ohne zu zeichnen
eva.pendown()Stift wieder absetzen
eva.color("red")Farbe wechseln: "blue", "green", "orange", "purple" …
eva.pensize(3)Strichdicke
eva.speed(0)ohne Animation zeichnen, praktisch bei grossen Mustern

Schleifen

Eine Schleife lässt den Computer dieselbe Sache immer wieder tun. Ein Quadrat zum Beispiel besteht viermal aus demselben Paar: vorwärts, drehen.

eva.forward(100)
eva.right(90)
eva.forward(100)
eva.right(90)
eva.forward(100)
eva.right(90)
eva.forward(100)
eva.right(90)

Statt alles viermal zu tippen, schreiben wir es einmal und sagen, wie oft es ausgeführt werden soll.

Die for-Schleife

PythonLoading editor…
import turtle
eva = turtle.Turtle()

for i in range(4):
    eva.forward(100)
    eva.right(90)

Alles, was unter der for-Zeile eingerückt ist, wird wiederholt. Ändern Sie die 4 auf 2 oder auf 8. Was passiert, und warum?

Detektivaufgabe: Was macht range?

In der Schleife steht for i in range(4). Doch was liefert range eigentlich, und welche Werte nimmt i an? Finden Sie es mit Experimenten selbst heraus:

  1. Führen Sie den Code unten aus. Welche Werte nimmt i an? Wo beginnt die Zählung, wo hört sie auf?
  2. Ändern Sie die Zahl in der Klammer. Sagen Sie jeweils die Ausgabe voraus, bevor Sie auf Run klicken.
  3. Untersuchen Sie, was range macht, wenn mehr in der Klammer steht. Probieren Sie auch negative Zahlen aus.

Halten Sie Ihre Ergebnisse in der Notiz fest: eine Regel pro Fall, jeweils mit einem Beispiel.

PythonLoading editor…
for i in range(5):
    print(i)
Tipp

range kann mit einem, zwei oder drei Argumenten gebraucht werden, zum Beispiel range(5), range(2, 8) oder range(0, 20, 5). Die Argumente werden mit Kommas getrennt.

Ergebnisse: So funktioniert range

Weil i bei jedem Durchlauf grösser wird, kann die Turtle damit Linien zeichnen, die immer länger werden:

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

for i in range(60):
    eva.forward(i * 3)
    eva.right(91)

Ersetzen Sie die 91 durch 90, 120 oder 144. Ein einziger Winkel macht ein ganz anderes Bild.

Aufgaben zu for

Aufgabe 7.1: Dreieck

Zeichnen Sie mit einer for-Schleife ein gleichseitiges Dreieck mit Seitenlänge 150. Um wie viel Grad muss sich die Turtle an jeder Ecke drehen? Tipp: Nach dem ganzen Dreieck schaut sie wieder in die Startrichtung, hat sich also insgesamt um 360° gedreht.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
Aufgabe 7.2: Vielecke

Zeichnen Sie ein regelmässiges Vieleck mit Seitenlänge 80. Die Anzahl Ecken steht in der Variablen ecken. Ihr Programm soll für jeden Wert funktionieren: Testen Sie mit 5, 8 und 12. Lassen Sie zum Prüfen ecken = 6 stehen.

PythonLoading editor…
import turtle
eva = turtle.Turtle()

ecken = 6
Aufgabe 7.3: Ungerade Zahlen

Schreiben Sie eine for-Schleife, die alle ungeraden Zahlen von 101 bis 199 ausgibt, jede auf einer eigenen Zeile.

PythonLoading editor…
Aufgabe 7.4: Eckige Spirale

Zeichnen Sie eine eckige Spirale. Die Linien sind 10, 20, 30, …, 200 Schritte lang, nach jeder Linie dreht die Turtle um 90° nach links. Verwenden Sie range mit drei Argumenten.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
Aufgabe 7.5: Gestrichelte Linie

Zeichnen Sie eine gestrichelte Linie aus 10 Strichen. Jeder Strich ist 15 Schritte lang, jede Lücke 10 Schritte.

PythonLoading editor…
import turtle
eva = turtle.Turtle()

Verschachtelte Schleifen

Eine Schleife darf in einer anderen stehen. Die innere Schleife läuft dann bei jedem Durchlauf der äusseren komplett durch.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

for blatt in range(12):
    for seite in range(4):
        eva.forward(80)
        eva.right(90)
    eva.right(30)

Die innere Schleife zeichnet ein Quadrat. Die äussere wiederholt das zwölfmal und dreht die Turtle nach jedem Quadrat um 30°. Achten Sie auf die Einrückung: eva.right(30) gehört zur äusseren Schleife, nicht zur inneren.

Mit print lässt sich die Reihenfolge genau verfolgen:

PythonLoading editor…
for i in range(1, 4):
    print("Abschnitt", i)
    for j in range(2):
        print("  Zeile", j)
Aufgabe 7.6: Quadrate in einer Reihe

Zeichnen Sie fünf Quadrate mit Seitenlänge 40 nebeneinander. Zwischen zwei Quadraten liegt eine Lücke von 20 Schritten.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
Aufgabe 7.7: Rosette

Zeichnen Sie 36 Sechsecke mit Seitenlänge 60. Nach jedem Sechseck dreht sich die Turtle um 10°. Mit eva.speed(0) geht es schneller.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

Die while-Schleife

Die for-Schleife braucht eine feste Anzahl Durchläufe. Manchmal weiss man diese Anzahl vorher nicht. Dann nimmt man while: Wiederhole, solange die Bedingung wahr ist.

PythonLoading editor…
zeit = 5
while zeit > 0:
    print(zeit)
    zeit = zeit - 1
print("Raketenstart!")

Dasselbe mit der Turtle: Die Linien werden länger, solange sie kürzer als 200 sind.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

laenge = 5
while laenge < 200:
    eva.forward(laenge)
    eva.left(90)
    laenge += 5

Die Schreibweise laenge += 5 bedeutet dasselbe wie laenge = laenge + 5. Genauso gibt es -=, *= und /=.

Endlosschleife

In der Schleife muss sich etwas ändern, sonst bleibt die Bedingung für immer wahr und das Programm hört nie auf. Löschen Sie in der Spirale die Zeile laenge += 5 und starten Sie das Programm: Die Turtle läuft im Kreis, für immer. Mit dem Stop-Knopf halten Sie sie an.

break und continue

break verlässt die Schleife sofort. Das ist praktisch zusammen mit while True: Die Schleife läuft eigentlich endlos, bis ein break sie beendet.

Hier macht eva einen Zufallsspaziergang: Bei jedem Schritt dreht sie sich zufällig um 0°, 90°, 180° oder 270°. Sobald sie mehr als 150 Schritte von der Mitte entfernt ist, hört sie auf. Wie lange das dauert, weiss vorher niemand. Starten Sie das Programm mehrmals.

PythonLoading editor…
import turtle
import random
eva = turtle.Turtle()
eva.speed(0)

schritte = 0
while True:
    eva.left(random.randint(0, 3) * 90)
    eva.forward(20)
    schritte += 1
    if abs(eva.xcor()) > 150 or abs(eva.ycor()) > 150:
        break

print("Nach", schritte, "Schritten ist eva am Rand.")

eva.xcor() und eva.ycor() liefern die Position der Turtle, abs() lässt das Vorzeichen weg.

continue bricht nicht die ganze Schleife ab, sondern nur den aktuellen Durchlauf. Die Schleife macht mit dem nächsten Durchlauf weiter.

PythonLoading editor…
for i in range(10):
    if i == 5:
        continue
    if i == 8:
        break
    print(i)
0
1
2
3
4
6
7

Aufgaben zu while, break und continue

Aufgabe 7.8: Von for zu while

Schreiben Sie die folgende for-Schleife als while-Schleife um, sodass sie genau dieselben Werte ausgibt.

PythonLoading editor…
for i in range(-10, 10, 2):
    print(i)
Aufgabe 7.9: Treppe

Die Turtle zeichnet eine Treppe: 20 Schritte nach rechts, 20 nach oben, und so weiter. Dabei steigt sie, solange sie weniger als 150 Schritte über dem Start steht. Verwenden Sie while und eva.ycor().

PythonLoading editor…
import turtle
eva = turtle.Turtle()
Aufgabe 7.10: Sternmaschine

Die Turtle zeichnet immer wieder eine Linie der Länge 200 und dreht sich um winkel Grad nach rechts, bis sie wieder genau am Start steht. Dann bricht sie mit break ab und gibt aus, wie viele Linien sie gezeichnet hat.

  • Verwenden Sie while True und einen Zähler.
  • «Am Start» heisst: abs(eva.xcor()) < 1 and abs(eva.ycor()) < 1. Genau 0 klappt nicht immer, weil der Computer mit Kommazahlen leicht ungenau rechnet.
  • Probieren Sie danach die Winkel 135, 170 und 100 aus. Lassen Sie zum Prüfen winkel = 144 stehen.
PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

winkel = 144
Aufgabe 7.11: Zaun mit Tor

Der Zaun hat 10 Pfosten im Abstand von 20 Schritten. Jeder Pfosten ist eine 50 Schritte hohe Linie nach oben. Der fünfte Pfosten fehlt, dort ist das Tor. Überspringen Sie ihn mit continue.

Ein Pfosten entsteht so: left(90), forward(50), back(50), right(90).

PythonLoading editor…
import turtle
eva = turtle.Turtle()

Weitere Aufgaben

Zusatzaufgabe 7.12: Gitter

Zeichnen Sie ein Gitter aus 4 × 4 Quadraten mit Seitenlänge 30, die sich berühren. Dafür braucht es drei Schleifen ineinander: Zeilen, Quadrate in einer Zeile, Seiten eines Quadrats. Am Ende einer Zeile muss die Turtle zurück an den Anfang und eine Zeile nach oben.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)
Zusatzaufgabe 7.13: Wie weit ist eva gelaufen?

Erweitern Sie die wachsende Spirale aus dem while-Beispiel: Zählen Sie in einer Variablen strecke zusammen, wie viele Schritte eva insgesamt gelaufen ist, und geben Sie die Zahl am Schluss aus.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)

laenge = 5
while laenge < 200:
    eva.forward(laenge)
    eva.left(90)
    laenge += 5
Zusatzaufgabe 7.14

Analysieren Sie das folgende Programm ohne Computer. Was gibt es aus, und was tut es allgemein?

wort = "ABRACADABRA"
counter = 0
for buchstabe in wort:
    if buchstabe == "A":
        counter += 1
print(counter)
Zusatzaufgabe 7.15: Eigenes Muster

Entwerfen Sie ein eigenes Muster mit mindestens zwei verschachtelten Schleifen. Spielen Sie mit Winkeln, Längen, color und pensize. Ideen: eine Blume aus Dreiecken, ein Stern aus Sternen, eine Spirale aus Quadraten, die mit i wachsen.

PythonLoading editor…
import turtle
eva = turtle.Turtle()
eva.speed(0)