(9) for-Schleifen

Mit einer Schleife lassen sich Teile eines Programms beliebig oft wiederholen. In Python gibt es zwei Möglichkeiten diese Wiederholungen anzugeben: die for– oder die while-Schleife. Dieser Artikel konzentriert sich auf die for-Schleife. Die while-Schleife wird im nächsten Kapitel vorgestellt. Die Syntax und das Vorgehen der for-Schleife in Python ist einfach und klar. Es lohnt sich aber, die Funktionsweise ein wenig genauer zu betrachten.

Challenge

Erstelle eine Liste mit allen Monaten. Gebe dann den Monatsindex sowie den Namen des Monats aus. Die Ausgabe kann beispielsweise so aussehen:
1 – Januar
2 – Februar

12 – Dezember

Gut zu wissen…

Die folgenden Punkte helfen, das Konzept der for-Schleifen in Python zu verstehen. Die Methoden range() und enumerate() sind built-in Funktionen, die häufig im Zusammenhang mit for-Schleifen verwendet werden.

  1. Idee & Syntax der for-Schleife
  2. Alles rund ums iterieren
  3. Schleifen mit der range() Methode
  4. Schleifen mit der enumerate() Methode

Idee & Syntax der for-Schleife

Mit einer for-Schleife lässt sich die Anzahl der Schleifendurchläufe (auch Iterationen genannt) fest vorgeben. Die Syntax ist in Python etwas anders als sie aus der ein oder anderen Programmiersprache (z. B. C oder Java) bekannt ist. In diesen Sprachen entspricht die Python for-Schleife der foreach Schleife. Schauen wir uns kurz die häufig verwendete Syntax der for-Schleife aus anderen Programmiersprachen an einem Beispiel mit Java an:

Das Beispiel gibt 10 mal den String “Hello World” mit entsprechender Schleifendurchlaufnummer (i) aus. Die Schleife berücksichtigt dabei drei Parameter:

  • Initialisierung: Findet vor dem Schleifendurchlauf statt; legt fest, mit welchem Wert gestartet wird. Im Beispiel ist i=0.
  • Zielwert / Bedingung: Legt den Zielwert oder die Bedingung fest, wie oft die Schleife durchlaufen wird. Im Beispiel ist der Zielwert 10.
  • Schrittweite: Legt fest, wie die Schleife durchlaufen wird. Im Beispiel wird i nach jedem Durchlauf inkrementiert.

Im Gegensatz zu der Angabe der drei Parameter basieren Schleifen in Python auf Kollektionen (Collections). Kollektionen sind Container, die mehrere Einzelobjekte enthalten. Die Sequenzen Listen und Tupel sind beispielsweise Kollektionen. Kollektionen haben noch eine weitere Eigenschaft, die für die for Schleife essentiell ist: Sie sind iterierbar, d.h. die einzelnen Elemente einer Kollektion können Schritt für Schritt durchlaufen werden. Mehr dazu etwas weiter unten.

Die Syntax der for-Schleife ist einfach: Der Schleifenkopf besteht aus einer Variablen (hier i, kann aber auch anders heißen), die das einzelne Element aus der Kollektion enthält sowie aus der Kollektion und einem Doppelpunkt. Die Anweisungen, die innerhalb der Schleife wiederholt werden sollen, werden mit einem Tab (oder vier Leerzeichen) eingerückt:

Bei einem Schleifendurchlauf wird ein Element aus einer Kollektion entnommen und der Variable (hier i) zugewiesen. Für jeden Schleifendurchlauf werden ein oder mehrere Anweisungen durchgeführt. Es erfolgen so viele Schleifendurchläufe, wie Elemente vorhanden sind. Der folgende Codeausschnitt zeigt ein Beispiel für eine for-Schleife in Python in dem die Elemente einer Einkaufsliste ausgelesen werden:

Alles rund ums iterieren

Im Zusammenhang mit Schleifen tauchen die Begriffe Iteration, iterierbar und Iterator immer wieder auf. Wir wollen ein wenig genauer schauen, was sich dahinter verbirgt. Im Beispiel oben werden die Elemente einer Liste in der Schleife ausgelesen. Es gibt aber noch viel mehr Objekte, die sich für eine for-Schleife eignen. Alle diese Objekte haben eines gemeinsam: sie sind iterierbar. Das bedeutet, dass jedes einzelne Element dieser Objekte nacheinander ausgelesen werden kann.

Technisch gesehen implementieren diese Objekte eine Methode: __iter__(). ( Jedes iterierbare Objekt stellt also eine solche Methode bereit.) Die doppelten Unterstriche vor und nach __iter__() deuten darauf hin, dass diese Methode intern verwendet wird – also nicht direkt vom Programmierer sondern von einer anderen Methode oder einem Operatoren aufgerufen wird. Mehr zu diesen so genannten Dunder Methoden kann man –>hier lesen.

Python stellt aber auch die built in Methodeiter()zur Verfügung. Dieser wird als Parameter das iterierbare Objekt übergeben. Intern ruft diese dann auf dem übergebenen Objekt die objektspezifische Methode __iter__() auf. Letztere gibt einen Iterator des übergebenen Objekts zurück, welcher dann von iter() zurückgegeben wird. Ist das Objekt nicht iterierbar, liefert iter() eine Fehlermeldung. Kurz und knapp: Mit der Methode iter() erhält man den Iterator eines iterierbaren Objekts.

Ein Iterator hat genau eine Aufgabe: Er gibt das nächste Element des iterierbaren Objekts zurück. Dazu wird die Methode next() genutzt (die intern wiederrum die Methode __next__() nutzt). Gibt es kein Element mehr, wird eine Fehlermeldung (StopIteration) ausgegeben.

Die for Schleife macht das, was wir im Beispiel oben manuell ausgeführt haben, automatisch. Sie holt sich per iter() den Iterator der Kollektion. Dann ruft sie so lange next() auf, bis kein Element mehr vorhanden ist. Das zurückgegebene Element aus next() wird der Variablen aus dem Schleifenkopf, im Beispiel unten i, in jedem Schleifendurchlauf zugewiesen.

Schleifen mit der range() Methode

Schleifen tauchen häufig mit der range Methode auf. Diese legt einen Bereich fest, beispielsweise 0 – 10, der dann schrittweise durchlaufen wird. Die in der Methode als Parameter angegebene Unter- und Obergrenze bilden den Anfangs- und Endwert des vorgegebenen Bereichs, wobei die Obergrenze selbst nicht enthalten ist. range() liefert dann eine Liste mit den entsprechenden Werte zurück über die in der Schleife iteriert wird. Bei range(0,10) ist der Rückgabewert beispielsweise [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].

Sollte die range() Methode mit nur einer Zahl aufgerufen werden, geht Python davon aus, dass nur die Obergrenze angegeben ist und setzt 0 auf den Anfangswert. range(4) liefert dann beispielsweise [0, 1, 2, 3].

Optional kann der range() Methode auch noch ein Schrittparameter mitgegeben werden. Mit Hilfe dieses Parameters wird angeben, wie durch das Intervall iteriert wird. In den folgenden Beispielen wird jede zweite Zahl übersprungen oder das Interval rückwärts gezählt.

Schleifen mit der enumerate() Methode

Manchmal möchte man über eine Liste iterieren und dabei den Index des aktuellen Elements in der Liste kennen. Mit der range Methode kann man einen Index erstellen, in dem man die Länge der Liste als obere Bereichsgrenze wählt. Dies sieht dann beispielsweise so aus:

Mit der enumerate() Methode geht dies einfacher. Die enumerate() Methode erhält als Parameter ein iterierbares Objekt, z.B. die Einkaufsliste. Zusätzlich wird ein Startindex angegeben. Der Default Wert des Startindexes ist 0. enumerate() gibt bei jedem Schleifendurchlauf ein Tupel zurück, indem der aktuelle Index und das aktuelle Element enthalten ist.

Spickzettel…

Schreibe einen Kommentar

Menü schließen