Python / range() / Aufeinanderfolgende oder gleichmäßig verteilte Ganzzahlen
Pythons range() erzeugt eine unveränderliche Sequenz gleichmäßig verteilter Ganzzahlen. Der Startwert ist enthalten, die Grenze stop nicht. Das Vorzeichen von step bestimmt die Richtung. Ein range unterscheidet sich von einer Liste aller Werte und einem beim Durchlaufen verbrauchten Generator.
Grundregeln für start, stop und step
Die range-Referenz beschreibt range(stop), range(start, stop) und range(start, stop, step). Standardwerte sind Start null und Schritt eins. Argumente müssen Ganzzahlen sein oder das Ganzzahl-Indexprotokoll unterstützen; gewöhnliche Floats und Zahlstrings werden nicht automatisch umgewandelt.
Verwenden Sie Python 3. Speichern Sie jedes vollständige Beispiel als range_example.py in UTF-8 und führen Sie python range_example.py beziehungsweise python3 aus. Ersetzen Sie den Inhalt für unabhängige Versuche. Bei kleinen Bereichen zeigt list() alle Werte.
print(list(range(4)))
print(list(range(1, 6)))
print(list(range(1, 10, 2)))
Erwartete Ausgabe:
[0, 1, 2, 3]
[1, 2, 3, 4, 5]
[1, 3, 5, 7, 9]
range(4) ergibt null bis drei, range(1, 6) eins bis fünf. Für fünf einschließlich bei Schritt eins setzen Sie stop auf sechs. Bei Schritt zwei muss der letzte Wert nicht stop minus eins sein; Abstand und Grenze müssen zusammen passen.
Negative Schritte und leere Bereiche
Positive Schritte enthalten Werte kleiner als stop, negative Schritte Werte größer als stop. Für absteigende Folgen ist ein negativer Schritt nötig. Passt die Richtung nicht zu den Grenzen, entsteht ein leerer Bereich statt eines Fehlers.
print(list(range(10, -5, -3)))
print(list(range(5, 0, -1)))
print(list(range(5, 0)))
print(list(range(0, 5, -1)))
print(list(range(3, 3)))
[10, 7, 4, 1, -2]
[5, 4, 3, 2, 1]
[]
[]
[]
range(10, -5, -3) ergibt 10, 7, 4, 1, -2. Der nächste Wert -5 entspricht stop und entfällt. Für fünf bis eins verwenden Sie range(5, 0, -1). Gleicher Start und Stopp erzeugen ebenfalls einen leeren Bereich, dessen Schleifenrumpf nie ausgeführt wird.
Indizieren und iterieren ohne Liste
Die Ausgabe eines range zeigt seine Darstellung statt aller Elemente. Werte werden aus Grenzen und Schritt berechnet; Länge, Indizierung, Slicing und Enthaltensein werden unterstützt. Wegen Unveränderlichkeit können Sie Elemente nicht per Indexzuweisung ersetzen.
numbers = range(2, 10, 2)
print(numbers)
print(len(numbers))
print(numbers[0], numbers[-1])
print(list(numbers[1:3]))
print(6 in numbers, 7 in numbers)
print(list(numbers))
print(list(numbers))
range(2, 10, 2)
4
2 8
[4, 6]
True False
[2, 4, 6, 8]
[2, 4, 6, 8]
Zweimaliges Umwandeln desselben range ergibt dieselben Elemente. Der Bereich selbst ist kein erschöpfbarer Generator. Ein gesondert mit iter(numbers) erzeugter Iterator wird hingegen verbraucht. Auch ein Slice ergibt einen range, der hier zur Ansicht in eine Liste umgewandelt wird.
Schritt null, Floats und Strings verursachen Fehler
Schritt null definiert keinen Fortschritt und löst ValueError aus. 3.0 bleibt trotz ganzzahligem Wert ein Float, "3" ist ein String: Beide erzeugen TypeError.
for arguments in ((1, 5, 0), (3.0,), ("3",)):
try:
print(range(*arguments))
except (ValueError, TypeError) as error:
print(type(error).__name__)
ValueError
TypeError
TypeError
Ist Ganzzahltext eine erlaubte Eingabe, prüfen und konvertieren Sie ihn gesondert mit int(). Blindes Abschneiden von Floats kann unerwünschte Bereiche erzeugen; legen Sie zuerst die Eingaberegeln fest. Die Ausnahmebehandlung vergleicht ungültige Eingaben, statt Fehlschläge stillschweigend als Erfolg zu behandeln.
range oder enumerate passend zur Schleife wählen
Eine range-Schleife eignet sich für feste Anzahlen oder ganzzahlige Schritte. Werden nur Elemente gebraucht, iterieren Sie direkt über die Liste. Für Elemente mit Nummern vermeidet enumerate() manuelle Indexberechnungen.
for number in range(1, 4):
print("Step", number)
names = ["Ada", "Bo"]
for number, name in enumerate(names, start=1):
print(number, name)
Step 1
Step 2
Step 3
1 Ada
2 Bo
Die erste Schleife hat drei Schritte von eins bis drei. In der zweiten ändert start=1 nur die Nummerierung und überspringt kein Element. Für tatsächliche Indizes oder Positionsberechnungen bleibt range(len(items)) geeignet.
Große Bereiche und tatsächlichen Aufwand unterscheiden
Ein range stellt große Grenzen ohne vollständige Ganzzahlliste dar, spart aber nicht die Zeit zum Besuchen jedes Werts. In CPython kann die darstellbare Längengrenze von len() zu OverflowError führen, obwohl sich der Bereich erstellen lässt.
import sys
numbers = range(sys.maxsize + 1)
print(numbers[0])
print(numbers[-1] == sys.maxsize)
try:
print(len(numbers))
except OverflowError:
print("OverflowError")
0
True
OverflowError
Das Beispiel prüft nur Endpunkte und den Längenfehler, ohne die Sequenz zu durchlaufen. sys.maxsize hängt von der Umgebung ab. Materialisieren Sie riesige Bereiche nicht beiläufig mit list(); durchlaufen Sie benötigte Abschnitte oder verarbeiten Sie Ergebnisse schrittweise.




