K103: for Schleife im Allgemeinen

Ziel

Im letzten Themenblock hast du die for Schleife kennengelernt. Genau genommen eine ganz spezifische Form dieser Schleife, namentlich in der Kombination mit range(). Wir nehmen nun das Thema nochmals auf. Ziel ist, dass du:

  • for Schleifen mit Listen erstellen kannst.
  • in diesem Zusammenhang verstehst, was range() bewirkt.
  • verstehst, für was die Variable aus dem Schleifenkopf genau genutzt werden kann.

Die for … in Schleife

Rückblick

Um was geht es bei Schleifen (oder auch Schlaufen)? Mit Schleifen werden gewisse Anweisungen mehrmals wiederholt. In Python existieren zwei verschiedene Arten von Schleifen, wovon eine davon die sogenannte for Schleife ist (die andere ist die while Schleife).

Wir haben gesehen, dass solche Schleifen aus einem Schleifenkopf und einem Schleifenrumpf (oder Schleifenkörper) bestehen.

Der Kopf besteht seinerseits aus 4 Teilen:

  1. for
    Das Wort for ist ein sogenanntes Schlüsselwort. Es sagt Python, dass es sich beim Nachfolgenden um eine Wiederholung handelt. Deshalb muss es auch an erster Stelle stehen.
  2. variable
    Als nächstes kommt eine Variable. Das kann ein beliebiger Name sein. Der Einfachheit halber haben wir meist bloss einen einzelnen Buchstaben wie z.B. ein i verwendet.
  3. in range(anzahl)
    Anschliessend muss man angeben, wie oft etwas wiederholt werden soll. Für 3 Wiederholungen schreibt man beispielsweise in range(3).
  4. :
    Am Ende steht ein Doppelpunkt!

Im Rumpf wird angegeben, was wiederholt werden soll. Damit Python weiss, welche Anweisungen mit zum Rumpf gehören, müssen diese alle eingerückt werden. Wichtig dabei ist:

  • Der Rumpf muss mindestens 1 Anweisung haben.
  • Alle Anweisungen müssen gleich viel eingerückt werden.
  • Der Rumpf ist beendet, sobald die erste Anweisung nicht mehr eingerückt ist.

Im Folgenden geht es vor allem um den dritten Teil des Kopfs, also um «in range()»

Ein Beispiel

Damit kommen wir nun zum eigentlichen Thema. Betrachten wir das nachfolgende Beispielprogramm:

from turtle import *

for i in [0, 1, 2]:
    forward(100)
    right(120)

exitonclick()

Im Programm haben wir die Anweisung range(3) durch [1, 2, 3] ersetzt. Und das Programm gibt wiederum unser bekanntes Dreieck auf dem Bildschirm aus.

Dreieck

Um zu verstehen, weshalb das so ist, muss man etwas mehr über die genaue Struktur der for Schleife wissen. Die Syntax lautet nämlich gernau genommen wie folgt:

for variablen in iterable:

Ein «iterable» ist einfach nur der Fachausdruck für etwas, was man durchzählen kann. Und was ist das genau? Nun das kann eben beispielsweise

  • eine Liste wie [0, 1, 2]
  • ein range Bereich wie range(3)

sein.

Ist es eine range (man sagt: ein range Objekt oder Iterator/ Generator), so haben wir die bereits bekannte Form aus dem vorangehenden Themenblock:

for variablen in range(anzahl):

Die im letzten Themenblock behandelte Anweisung for i in range(3) ist also ein ganz spezieller Anwendungsfall der allgemeinen for .. in ..: Schlaufe. Und ist es eine Liste, so haben wir den Anwendungsfall aus dem oben dargestellten Programm:

for variablen in [element1, element2, element3, …]:

for … in []

Damit man das besser versteht, müssen wir vorab kurz einen Blick auf Listen werfen (wir haben im Themenblock zu den Variablen bzw. Datentypen bereits erwähnt, dass es in Python Listen gibt).

Grundlage: Listen in Python

Eine Liste in Python besteht einfach aus mehreren Elementen. Das ist wie im richtigen Leben, wo beispielsweise eine Einkaufsliste aus mehreren zu kaufenden Produkten, eine Teilnehmerliste aus den einzelnen Kursteilnehmern, eine Rangliste aus den einzelnen Teams, etc. besteht.

Listen in Python werden durch eckige Klammern [ ] definiert. Etwas so:

auto = [«BMW», «Audi», «Fiat»]
zahlen = [1, 2, 3, 4, 5]

Wichtig an dieser Stelle ist lediglich:

  • Die Aufzählung der Elemente kommt zwischen die Klammern []
  • Zwischen den einzelnen Elementen hat es jeweils ein Komma ,
  • Es können beliebig viele Elemente sein.
  • Wörter (Zeichenketten) werden mit einfachen ‹ ‹ oder doppelten » » Anführungs- und Schlusszeichen aufgeschrieben, Zahlen ohne Anführungs- und Schlusszeichen.
  • Die Reihenfolge der Elemente ist wichtig. Die 2 Listen

    colors = [«blue», «red», «black»]
    colors = [«red», «blue», «black»]

    sind nicht identisch!

Hinweis für Fortgeschrittene:

  • Man kann auch auf die einzelnen Elemente einer Liste zugreifen. Hierzu nutzt man die Indexnotation, wie wir diese schon beim Tupel gesehen haben. D.h. man gibt die Indexnummer, startend bei 0, des Elements an. auto[0] ergibt «BMW» und auto[2] ergibt «Fiat».
  • Im Unterschied zu einem Tuple ist eine Liste aber veränderlich.

for in Schleife mit einer Liste

Nutzen wir die for Schleife nun mit einer solchen Liste, so ergibt sich die folgende Syntax:

for variablen in [element1, element2, …]:

Wir können diesen Schlaufenkopf wörtlich wie folgt übersetzen:

«wiederhole für jedes Element in der Liste:»

Damit wird nun auch deutlich, weshalb das Programm unser bekanntes Dreieck gezeichnet hat. Unsere Liste hat nämlich aus 3 Elementen bestanden, und für jedes einzelne Element wurde der Rumpf genau 1x ausgeführt.

Zu Illustration können wir unsere Liste auch anpassen und einfach drei andere Elemente verwenden. Beispielsweise 3 Fantasienamen.

from turtle import *

for i in ["Harry Potter", "Superman", "Batman"]:
    forward(100)
    right(120)

exitonclick()

Auch dieses Programm zeichnet unser bekanntes Dreieck.

Bedeutung der Variable

Es stellt sich natürlich die Frage, weshalb man for i in [«Harry Potter», «Superman», «Batman»] schreiben sollte, wenn doch auch for i in range(3) funktioniert?

Hier kommt unsere Variable ins Spiel. Die Variable nimmt nämlich in jedem Schleifendurchlauf den Wert des Elements an, welches gerade an der Reihe ist. Hierzu ein kleines Beispiel.

from turtle import *

for länge in [200, 100, 50, 20]:
    forward(länge)
    right(90)

exitonclick()

Das Programm führt zu folgender Grafik:

Als erstes haben wir unserer Variable einen sinnvollen Namen gegeben: länge. Wir könnten die Variable weiterhin auch i nennen, aber immer wenn man den Wert der Variable verwenden möchte, empfiehlt es sich, ein etwas aussagekräftigerer Namen zu verwenden.

Beim ersten Durchlauf der Schleife war der Wert der Variable länge 200. Entsprechend ist die Schildkröte 200 Schritte nach vorne. Beim zweiten Durchlauf war der Wert 100, dann 50 und schliesslich 20. Insgesamt wurde der Rumpf 4 Mal wiederholt, weil es genau 4 Elemente in der Liste hat.

In den nachfolgenden Aufgaben hast du nun Gelegenheit, um das Gesagte einzuüben und auszuprobieren.

Ergänzung zum Thema range()

Vorab aber noch eine Antwort auf unsere Frage, was range(anzahl) genau bewirkt:

Etwas vereinfacht ausgedrückt macht range(anzahl) nichts anderes, also für uns eine solche Liste zu generieren, und zwar mit den Zahlen von 0 bis anzahl. D.h. range(3) generiert eine Liste [0, 1, 2].

Eine range ist in Python eine unveränderbare Folge von Zahlen mit einem Anfangswert, einem Endwert und einer Schrittweite.

  • Wird der Funktion nur ein Wert übergeben, so steht dieser Wert für den Endwert (exklusive). Es wird eine Zahlenfolge startend von 0, einer Schrittweite von 1 und einem um 1 kleineren Endwert generiert. range(6) liefert demnach genau 6 Zahlen: 0, 1, 2, 3, 4, 5.
  • Bei zwei Werten steht die erste Zahl für den Anfangswert (inklusive) und die zweite für den Endwert (exklusive). Die Anweisung range(6, 20) liefert demnach die Werte 6 bis und mit 19.
  • Bei drei Werten definiert die dritte Zahl die Schrittweite, wobei auch negative Schrittweiten möglich sind.

Hinweis für Fortgeschrittene:
Auf den ersten Blick könnte man meinen, dass die range() Funktion automatisch eine Liste mit den entsprechenden Zahlen erstellt. Genau genommen liefert die Funktion aber keine Liste, sondern lediglich einen Iterator. Einen sogenannten range Folgetyp, welcher Zahlen in einem bestimmten Bereich generiert. Der genaue Unterschied ist aber für unsere Anwendung hier unerheblich.

Übungsaufgaben

Nachfolgend findest Du ein paar Übungsaufgaben.


Aufgabe 1: ein Rechteck

Korrigiere die Listenwerte so, dass aus dem nebenstehenden Programm ein Rechteck mit 100 Punkten Breite und 50 Punkten Höhe entsteht.

from turtle import *

for länge in [200, 100, 50, 20]:
    forward(länge)
    right(90)

exitonclick()

Aufgabe 2: farbige Dreiecke

Versuche die rechts abgebildeten farbigen gleichseitigen Dreiecke nachzuzeichnen. Die Seitenlänge beträgt 80 Punkte, der Abstand zwischen den Dreiecken 20 Punkt.

Hinweis: Die Stiftfarbe ist schwarz, als Stiftdicke kannst du z.B. 5 Punkte nehmen. Die Farbcodes der Füllfarben sind «green», «red», «blue»

Aufgabe 3: 8 Dreiecke

Versuche die rechts abgebildeten Figur nachzuzeichnen.

Tipp: Es sind 8 gleichseitige Dreiecke mit den Seitenlängen 10, 20, 30, 40, 50, 60, 70, 80 Punkten.

Aufgabe 3b: 8 Dreiecke mit range()

Versuche nun dieselbe Figur mit der range() Anweisung zu zeichnen. Gibt es mehrere Möglichkeiten?

Aufgabe 4: Drehende Vierecke

Erstelle das rechts abgebildete Bild. Es besteht aus 120 Quadraten.

Tipp: die Grössen sind 2, 4, 6, 8, …., 240 Punkte. Gedreht wird jedes Mal 3 Punkte nach links.

Aufgabe 5: Spiral Helix

Ein weiteres spannendes Bild. Die Grundfigur sind 2 Kreise, einer nach oben und einer nach unten (eine 8).

Tipp: Du kannst auch etwas spielen und die Parameter verändern.

Spiral Helix

Aufgabe 6: Masteraufgabe

Versuche die rechts abgebildete Figur nachzustellen.

Hinweis: Es sind insgesamt 360 Strich. Für die Farben nutze eine Liste colors = [‹red›, ‹purple›, ‹blue›, ‹green›, ‹orange›, ‹yellow›].

bunte Spirale

Hinweis 2: Du kannst auf Listenelemente zugreifen, indem du Klammern nutzt. In den Klammern steht der Index, beginnend bei 0. colors[0] gibt das erste Element, colors[1] das zweite Element etc. zurück. Nutze den Modulo Operator %.

Comments