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:
Ausgabe:
0
1
2
3
4
Zwei Details, die Neulinge erwischen:
- Gezählt wird ab 0.
range(5)liefert dir fünf Zahlen, beginnend bei 0. - 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:
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:
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:
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:
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:
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.
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:
Trotzdem ist enumerate(items) meistens sauberer.
Jedes zweite Element iterieren.
Das gibt a, c, e aus. Für einfaches Slicing ist die Slicing-Syntax allerdings noch direkter: items[::2].
Eine schnelle Zahlenliste erzeugen.
Das ist eine List Comprehension — später behandelt —, aber range liefert die Zahlen.
Was range() nicht ist
Zwei scharfe Kanten, die du kennen solltest:
rangeerzeugt nur Ganzzahlen. Brauchst du Fließkomma-Schritte (etwa 0.0 bis 1.0 in Schritten von 0.1), nimmnumpy.arangeoder eine Schleife mit eigenem Zähler.rangefunktioniert nicht mit beliebigen Iterables. Er ist speziell für Ganzzahlen. Versuchst du, über eine Liste zu „ranken“, suchst du vermutlichenumerateoder einfach die Liste selbst.
Alles zusammen
Ein kleines Beispiel, das mehrere Varianten in einem Rutsch nutzt:
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).