Menu

Python range(): Start, Stop, Step und rückwärts zählen

Wie range() in Python funktioniert — Start, Stop, Step, negative Ranges und warum er lazy ist statt eine Liste zu materialisieren.

Ein Werkzeug, um Zahlen zu erzeugen

range() macht genau eine Sache: es erzeugt eine Folge von Ganzzahlen. Es ist der Standardpartner für for-Schleifen, wenn du eine bestimmte Anzahl Iterationen brauchst oder ein numerisches Intervall abschreitest.

Die einfachste Form nimmt ein Argument — den Stopp-Wert:

main.py
Output
Click Run to see the output here.

Ausgabe:

0
1
2
3
4

Zwei Details, die Neulinge erwischen:

  1. Gezählt wird ab 0. range(5) liefert dir fünf Zahlen, beginnend bei 0.
  2. Der Stopp-Wert ist exklusiv. range(5) stoppt vor 5 — es schließt die 5 nicht ein.

Diese Regeln sind in Python beim Slicing, Indexieren und bei range-Operationen einheitlich. Sobald du „stop ist exklusiv“ verinnerlichst, stolperst du nicht mehr darüber.

Drei Formen

range() nimmt ein, zwei oder drei Argumente:

main.py
Output
Click Run to see the output here.

Der Schritt ist die Sprungweite. range(0, 20, 4) erzeugt jede vierte Zahl. Behalt das im Hinterkopf, wenn du „jedes zweite Element“ oder „jede zehnte Stichprobe“ brauchst.

Rückwärts zählen

Die Schrittweite darf negativ sein, was dir erlaubt, rückwärts zu zählen:

main.py
Output
Click Run to see the output here.

Auch hier ist der Stopp exklusiv — range(10, 0, -1) stoppt vor 0, nicht bei 0. Um die 0 einzuschließen, setz den Stopp auf -1:

main.py
Output
Click Run to see the output here.

range ist lazy

In Python 3 baut range() keine Liste von Zahlen im Speicher. Es liefert ein schlankes range-Objekt, das Zahlen einzeln auf Abruf erzeugt. Deshalb kannst du schreiben:

main.py
Output
Click Run to see the output here.

Ein Milliarden-„Range“ verbraucht im Grunde keinen Speicher. Die Zahlen werden erzeugt, sobald die Schleife sie anfordert.

Brauchst du tatsächlich eine Liste der Zahlen — weil du sie ändern, sortieren oder jenseits der Basics indizieren willst —, wandle explizit um:

main.py
Output
Click Run to see the output here.

Meistens brauchst du die Liste nicht. for i in range(...) funktioniert direkt.

Häufige Muster

Eine Handvoll Rezepte, die du ständig nutzen wirst:

Etwas n-mal tun.

main.py
Output
Click Run to see the output here.

Das _ ist eine Konvention für „dieser Wert interessiert mich nicht“ — Python erzwingt es nicht, aber jeder Leser erkennt die Absicht.

In eine Sequenz indizieren.

Bevorzuge enumerate() gegenüber range(len(...)), aber wenn du gezielt nur den Index brauchst:

main.py
Output
Click Run to see the output here.

Trotzdem ist enumerate(items) meistens sauberer.

Jedes zweite Element iterieren.

main.py
Output
Click Run to see the output here.

Das gibt a, c, e aus. Für einfaches Slicing ist die Slicing-Syntax allerdings noch direkter: items[::2].

Eine schnelle Zahlenliste erzeugen.

main.py
Output
Click Run to see the output here.

Das ist eine List Comprehension — später behandelt —, aber range liefert die Zahlen.

Was range() nicht ist

Zwei scharfe Kanten, die du kennen solltest:

  1. range erzeugt nur Ganzzahlen. Brauchst du Fließkomma-Schritte (etwa 0.0 bis 1.0 in Schritten von 0.1), nimm numpy.arange oder eine Schleife mit eigenem Zähler.
  2. range funktioniert nicht mit beliebigen Iterables. Er ist speziell für Ganzzahlen. Versuchst du, über eine Liste zu „ranken“, suchst du vermutlich enumerate oder einfach die Liste selbst.

Alles zusammen

Ein kleines Beispiel, das mehrere Varianten in einem Rutsch nutzt:

main.py
Output
Click Run to see the output here.

Zwei verschachtelte range-getriebene Schleifen, die ein Gitter erzeugen. Beachte, dass beide Schleifen bei 1 starten — range(1, 6) —, weil wir Beschriftungen von 1 bis 5 wollen.

Weiter zu den Sammlungen

Du hast jetzt Bedingungen, beide Schleifenarten und range gesehen. Das ist genug Kontrollfluss, um jede Sammlung zu steuern. Nächstes Kapitel: die Sammlungen selbst — Listen, Tupel, Sets und Dictionaries.

Häufig gestellte Fragen

Was macht range() in Python?

range() erzeugt eine Folge von Ganzzahlen. range(n) liefert 0 bis n-1. range(start, stop) gibt Ganzzahlen von start bis (aber ohne) stop. range(start, stop, step) lässt dich die Schrittweite wählen, auch mit negativen Schritten fürs Rückwärtszählen.

Erzeugt range() eine Liste?

Nein. In Python 3 liefert range() ein schlankes range-Objekt, das Zahlen auf Abruf erzeugt. Deshalb ist range(10**9) sofort da — es wird nicht wirklich eine Milliarde Ganzzahlen alloziert. Pack es in list(...), wenn du wirklich eine Liste brauchst.

Wie zähle ich mit range() in Python rückwärts?

Nimm eine negative Schrittweite: range(10, 0, -1) zählt 10, 9, 8, ..., 1. Denk dran, dass der stop-Wert immer exklusiv ist, also brauchst du für die Null range(10, -1, -1).

Lerne mit Coddy zu programmieren

LOS GEHT'S