Die Python range () Funktion (Anleitung)
Die in Python integrierterange
-Funktion ist praktisch, wenn Sie eine Aktion eine bestimmte Anzahl von Malen ausführen müssen. Als erfahrener Pythonista haben Sie ihn höchstwahrscheinlich schon einmal verwendet. Aber was macht es?
Am Ende dieses Handbuchs werden Sie:
-
Verstehen Sie, wie die Funktion von Python
range
funktioniert -
Wissen, wie sich die Implementierungen in Python 2 und Python 3 unterscheiden
-
Ich habe eine Reihe von praktischen Beispielen für
range()
gesehen -
Seien Sie gerüstet, um einige seiner Einschränkungen zu umgehen
Lass uns loslegen!
Free Bonus:Click here to get our free Python Cheat Sheet zeigt Ihnen die Grundlagen von Python 3, z. B. das Arbeiten mit Datentypen, Wörterbüchern, Listen und Python-Funktionen.
Der Verlauf derrange()
-Funktion von Python
Obwohlrange()
in Python 2 undrange()
in Python 3 einen gemeinsamen Namen haben können, handelt es sich um völlig unterschiedliche Tiere. Tatsächlich istrange()
in Python 3 nur eine umbenannte Version einer Funktion, die in Python 2xrange
heißt.
Ursprünglich erzeugten sowohlrange()
als auchxrange()
Zahlen, die mit for-Schleifen wiederholt werden konnten, aber die ersteren erzeugten eine Liste dieser Zahlen auf einmal, während die letzteren Zahlenlazily erzeugten, was bedeutet Die Nummern wurden nach Bedarf einzeln zurückgegeben.
Wenn riesige Listen herumhängen, wird Speicherplatz beansprucht. Es ist daher nicht verwunderlich, dassxrange()
range()
, den Namen und alles ersetzt hat. Sie können mehr über diese Entscheidung und den Hintergrund vonxrange()
vsrange()
inPEP 3100 lesen.
Note: PEP steht für Python Enhancement Proposal. PEPs sind Dokumente, die eine breite Palette von Themen abdecken können, einschließlich der vorgeschlagenen neuen Funktionen, des Stils, der Governance und der Philosophie.
Es gibta ton of them. PEP 1 erklärt, wie sie funktionieren und ist ein guter Anfang.
Für den Rest dieses Artikels verwenden Sie die in Python 3 vorhandene Funktion.
Auf geht's!
Lass uns eine Schleife machen
Bevor wir uns ansehen, wierange()
funktioniert, müssen wir uns ansehen, wie Schleifen funktionieren. Die Schleife beträgt akey computer science concept. Wenn Sie ein guter Programmierer sein möchten, gehört das Mastering von Loops zu den ersten Schritten, die Sie ausführen müssen.
Hier ist ein Beispiel für eine for-Schleife in Python:
captains = ['Janeway', 'Picard', 'Sisko']
for captain in captains:
print(captain)
Die Ausgabe sieht folgendermaßen aus:
Janeway
Picard
Sisko
Wie Sie sehen können, können Sie mit einer for-Schleife einen bestimmten Codeblock beliebig oft ausführen. In diesem Fall haben wir eine Liste der Kapitäne durchlaufen und jeden ihrer Namen gedruckt.
Obwohl Star Trek großartig ist und alles, möchten Sie vielleicht mehr als nur eine Liste von Kapitänen durchlaufen. Manchmal möchten Sie einen Codeblock nur eine bestimmte Anzahl von Malen ausführen. Loops können Ihnen dabei helfen!
Versuchen Sie den folgenden Code mit Zahlen, die durch drei teilbar sind:
numbers_divisible_by_three = [3, 6, 9, 12, 15]
for num in numbers_divisible_by_three:
quotient = num / 3
print(f"{num} divided by 3 is {int(quotient)}.")
Die Ausgabe dieser Schleife sieht folgendermaßen aus:
3 divided by 3 is 1. 6 divided by 3 is 2. 9 divided by 3 is 3. 12 divided by 3 is 4. 15 divided by 3 is 5.
Das ist die Ausgabe, die wir wollten, also hat die Schleife die Arbeit angemessen erledigt, aber es gibt eine andere Möglichkeit, mitrange()
das gleiche Ergebnis zu erzielen.
Note: Das letzte Codebeispiel hatte eine Zeichenfolgenformatierung. Um mehr zu diesem Thema zu erfahren, können SiePython String Formatting Best Practices undPython 3’s f-Strings: An Improved String Formatting Syntax (Guide) überprüfen.
Nachdem Sie sich mit Schleifen besser auskennen, wollen wir sehen, wie Sierange()
verwenden können, um Ihr Leben zu vereinfachen.
Grundlagen von Pythonrange()
Wie funktioniert dierange
-Funktion von Python? In einfachen Worten können Sie mitrange()
eine Reihe von Zahlen innerhalb eines bestimmten Bereichs generieren. Abhängig davon, wie viele Argumente Sie an die Funktion übergeben, können Sie entscheiden, wo diese Zahlenreihe beginnen und enden soll und wie groß der Unterschied zwischen einer Zahl und der nächsten sein wird.
Hier ein kleiner Einblick inrange()
in Aktion:
for i in range(3, 16, 3):
quotient = i / 3
print(f"{i} divided by 3 is {int(quotient)}.")
In dieser for-Schleife konnten Sie einfach einen Bereich von Zahlen erstellen, die durch3
teilbar sind, sodass Sie nicht jede von ihnen selbst angeben mussten.
Note: Während dieses Beispiel eine angemessene Verwendung vonrange()
zeigt, ist es normalerweise verpönt,range()
in for-Schleifen zu oft zu verwenden.
Beispielsweise würde die folgende Verwendung vonrange()
im Allgemeinen nicht als pythonisch angesehen:
captains = ['Janeway', 'Picard', 'Sisko']
for i in range(len(captains)):
print(captains[i])
range()
eignet sich hervorragend zum Erstellen von Iterablen von Zahlen, ist jedoch nicht die beste Wahl, wenn Sie Daten durchlaufen müssen, die mitin
operator wiederholt werden könnten.
Wenn Sie mehr wissen möchten, lesen SieHow to Make Your Python Loops More Pythonic.
Es gibt drei Möglichkeiten, wie Sierange()
aufrufen können:
-
range(stop)
akzeptiert ein Argument. -
range(start, stop)
akzeptiert zwei Argumente. -
range(start, stop, step)
akzeptiert drei Argumente.
range(stop)
Wenn Sierange()
mit einem Argument aufrufen, erhalten Sie eine Reihe von Zahlen, die bei0
beginnen und jede ganze Zahl bis zu der Zahl enthalten, die Sie alsstop
angegeben haben. s.
So sieht das in der Praxis aus:
for i in range(3):
print(i)
Die Ausgabe Ihrer Schleife sieht folgendermaßen aus:
0 1 2
Das überprüft: Wir haben alle ganzen Zahlen von0
bis einschließlich3
, jedoch ohnestop
.
range(start, stop)
Wenn Sierange()
mit zwei Argumenten aufrufen, können Sie nicht nur entscheiden, wo die Zahlenreihe endet, sondern auch, wo sie beginnt, sodass Sie nicht immer bei0
beginnen müssen. Mitrange()
können Sie eine Reihe von Zahlen vonA bisB mitrange(A, B)
generieren. Lassen Sie uns herausfinden, wie Sie einen Bereich ab1
generieren.
Versuchen Sie,range()
mit zwei Argumenten aufzurufen:
for i in range(1, 8):
print(i)
Ihre Ausgabe sieht folgendermaßen aus:
1 2 3 4 5 6 7
So weit, so gut: Sie haben alle ganzen Zahlen von1
(die Zahl, die Sie alsstart
angegeben haben) bis zu8
(die Zahl, die Sie alsstop
).
Wenn Sie jedoch ein weiteres Argument hinzufügen, können Sie die Ausgabe reproduzieren, die Sie zuvor erhalten haben, als Sie die Liste mit dem Namennumbers_divisible_by_three
verwendet haben.
range(start, stop, step)
Wenn Sierange()
mit drei Argumenten aufrufen, können Sie nicht nur auswählen, wo die Zahlenreihe beginnen und enden soll, sondern auch, wie groß der Unterschied zwischen einer Zahl und der nächsten sein soll. Wenn Sie keinstep
angeben, verhält sichrange()
automatisch so, als obstep
1
ist.
Note:step
kann eine positive oder eine negative Zahl sein, aber nicht0
:
>>>
>>> range(1, 4, 0)
Traceback (most recent call last):
File "", line 1, in
ValueError: range() arg 3 must not be zero
Wenn Sie versuchen,0
als Schritt zu verwenden, wird eine Fehlermeldung angezeigt.
Nachdem Sie nun wissen, wie manstep
verwendet, können Sie die zuvor gesehene Schleife mit Division durch3
endlich wieder aufrufen.
Probieren Sie es aus:
for i in range(3, 16, 3):
quotient = i / 3
print(f"{i} divided by 3 is {int(quotient)}.")
Ihre Ausgabe sieht genauso aus wie die Ausgabe der for-Schleife, die Sie zuvor in diesem Artikel gesehen haben, als Sie die Listenumbers_divisible_by_three
verwendet haben:
3 divided by 3 is 1. 6 divided by 3 is 2. 9 divided by 3 is 3. 12 divided by 3 is 4. 15 divided by 3 is 5.
Wie Sie in diesem Beispiel sehen, können Sie das Argumentstep
verwenden, um eine höhere Zahl zu erreichen. Das nennt man Inkrementieren.
Inkrementieren mitrange()
Wenn Sie inkrementieren möchten, benötigen Siestep
, um eine positive Zahl zu sein. Geben Sie den folgenden Code ein, um eine Vorstellung davon zu bekommen, was dies in der Praxis bedeutet:
for i in range(3, 100, 25):
print(i)
Wenn Ihrstep
25
ist, sieht die Ausgabe Ihrer Schleife folgendermaßen aus:
3 28 53 78
Sie haben eine Reihe von Zahlen erhalten, die jeweils um25
, die von Ihnen angegebenenstep
, größer als die vorhergehende Zahl waren.
Nachdem Sie gesehen haben, wie Sie durch einen Bereich vorwärts gehen können, ist es Zeit zu sehen, wie Sie rückwärts treten können.
Dekrementieren mitrange()
Wenn Ihrstep
positiv ist, bewegen Sie sich durch eine Reihe zunehmender Zahlen und erhöhen sich. Wenn Ihrstep
negativ ist, bewegen Sie sich durch eine Reihe abnehmender Zahlen und dekrementieren. Auf diese Weise können Sie die Zahlen rückwärts durchgehen.
Im folgenden Beispiel iststep
-2
. Das bedeutet, dass Sie für jede Schleife um2
dekrementieren:
for i in range(10, -6, -2):
print(i)
Die Ausgabe Ihrer Dekrementierungsschleife sieht folgendermaßen aus:
10 8 6 4 2 0 -2 -4
Sie haben eine Reihe von Zahlen erhalten, die jeweils um2
, dieabsolute value der von Ihnen angegebenenstep
kleiner als die vorhergehende Zahl waren.
Die pythonischste Methode zum Erstellen eines Bereichs, der sich verringert, ist die Verwendung vonrange(start, stop, step)
. Python verfügt jedoch über eine integriertereversed
-Funktion. Wenn Sierange()
inreversed()
einschließen, können Sie die Ganzzahlen in umgekehrter Reihenfolge drucken.
Probieren Sie es aus:
for i in reversed(range(5)):
print(i)
Sie erhalten Folgendes:
4 3 2 1 0
range()
ermöglicht das Durchlaufen einer dekrementierenden Folge von Zahlen, währendreversed()
im Allgemeinen verwendet wird, um eine Folge in umgekehrter Reihenfolge zu durchlaufen.
Note:reversed()
funktioniert auch mit Zeichenfolgen. Sie können mehr über die Funktionalität vonreversed()
mit Zeichenfolgen inHow to Reverse a String in Python erfahren.
Erweiterte Verwendungsbeispiele für dierange()
-Funktion von Python
Nachdem Sie die Grundlagen für die Verwendung vonrange()
kennen, ist es an der Zeit, etwas tiefer zu graben.
range()
wird hauptsächlich für zwei Zwecke verwendet:
-
Ausführen des Körpers einer for-Schleife eine bestimmte Anzahl von Malen
-
Erstellen effizienterer Iterablen von Ganzzahlen als mitlists or tuples
Die erste Verwendung ist wahrscheinlich die häufigste, und Sie könnten den Fall annehmen, dassitertools Ihnen eine effizientere Möglichkeit bietet, Iterables zu erstellen alsrange()
.
Hier sind einige weitere Punkte, die Sie bei der Verwendung der Reichweite beachten sollten.
range()
ist ein Typ in Python:
>>>
>>> type(range(3))
Sie können auf Elemente inrange()
nach Index zugreifen, genau wie bei einer Liste:
>>>
>>> range(3)[1]
1
>>> range(3)[2]
2
Sie können sogar die Slicing-Notation fürrange()
verwenden, aber die Ausgabe in einer REPL mag zunächst etwas seltsam erscheinen:
>>>
>>> range(6)[2:5]
range(2, 5)
Obwohl diese Ausgabe seltsam aussehen mag, gibt das Schneiden vonrange()
nur weitererange()
zurück.
Die Tatsache, dass Sie über den Index auf Elemente vonrange()
zugreifen und arange()
in Scheiben schneiden können, unterstreicht eine wichtige Tatsache:range()
ist im Gegensatz zu einer Liste faul, aberisn’t an iterator.
Floats undrange()
Möglicherweise haben Sie bemerkt, dass alle Zahlen, mit denen wir uns bisher befasst haben, ganze Zahlen sind, die auch als Ganzzahlen bezeichnet werden. Dies liegt daran, dassrange()
nur Ganzzahlen als Argumente verwenden kann.
Ein Wort zu Floats
Wenn in Python eine Zahl keine ganze Zahl ist, ist sie ein Float. Es gibt einige Unterschiede zwischen Ganzzahlen und Gleitkommazahlen.
Eine Ganzzahl (int
Datentyp):
-
Ist eine ganze Zahl
-
Enthält keinen Dezimalpunkt
-
Kann positiv, negativ oder
0
sein
Eine Gleitkommazahl (float
Datentyp):
-
Kann eine beliebige Zahl sein, die einen Dezimalpunkt enthält
-
Kann positiv oder negativ sein
Versuchen Sie,range()
mit einem Float aufzurufen, und sehen Sie, was passiert:
for i in range(3.3):
print(i)
Sie sollten die folgende Fehlermeldung erhalten:
Traceback (most recent call last):
File "", line 1, in
TypeError: 'float' object cannot be interpreted as an integer
Wenn Sie eine Problemumgehung suchen müssen, mit der Sie Floats verwenden können, können Sie NumPy verwenden.
Verwenden vonrange()
mit NumPy
NumPy ist eine Python-Bibliothek eines Drittanbieters. Wenn Sie NumPy verwenden möchten, müssen Sie zunächst überprüfen, ob es installiert ist.
So können Sie das in Ihrer REPL tun:
>>>
>>> import numpy
Wenn Sie einModuleNotFoundError
erhalten, müssen Sie es installieren. Gehen Sie dazu zu Ihrer Befehlszeile und geben Siepip install numpy
ein.
Sobald Sie es installiert haben, geben Sie Folgendes ein:
import numpy as np
np.arange(0.3, 1.6, 0.3)
Es wird dies zurückgeben:
array([0.3, 0.6, 0.9, 1.2, 1.5])
Wenn Sie jede Zahl in einer eigenen Zeile drucken möchten, haben Sie folgende Möglichkeiten:
import numpy as np
for i in np.arange(0.3, 1.6, 0.3):
print(i)
Dies ist die Ausgabe:
0.3 0.6 0.8999999999999999 1.2 1.5
Woher kamen0.8999999999999999
?
Computer haben Probleme beim Speichern von dezimalen Gleitkommazahlen in binären Gleitkommazahlen. Dies führt zu allerlei unerwarteten Darstellungen von Zahlen.
Note: Um mehr darüber zu erfahren, warum es Probleme gibt, die Dezimalstellen darstellen, können Siethis article undPython docs überprüfen.
Vielleicht möchten Sie auch einen Blick aufdecimal library werfen, was in Bezug auf Leistung und Lesbarkeit eine kleine Herabstufung darstellt, es Ihnen jedoch ermöglicht, Dezimalzahlen genau darzustellen.
Eine andere Option ist die Verwendung vonround()
, über die Sie inHow to Round Numbers in Python mehr lesen können. Denken Sie daran, dassround()
seine eigenen Macken hat, die zu überraschenden Ergebnissen führen können!
Ob diese Gleitkommafehler für Sie ein Problem darstellen oder nicht, hängt von dem Problem ab, das Sie lösen. Die Fehler werden so etwas wie die 16. Dezimalstelle sein, was die meiste Zeit unbedeutend ist. Sie sind so klein, dass Sie sich keine Sorgen machen müssen, es sei denn, Sie arbeiten an der Berechnung von Satellitenbahnbahnen oder Ähnlichem.
Alternativ können Sie auchnp.linspace()
verwenden. Es macht im Wesentlichen dasselbe, verwendet jedoch unterschiedliche Parameter. Mitnp.linspace()
geben Siestart
undend
(beide einschließlich) sowie die Länge des Arrays (anstelle vonstep
) an.
Zum Beispiel ergibtnp.linspace(1, 4, 20)
20 Zahlen mit gleichem Abstand:1.0, ..., 4.0
. Andererseits ergibtnp.linspace(0, 0.5, 51)
0.00, 0.01, 0.02, 0.03, ..., 0.49, 0.50
.
Note: Um mehr zu erfahren, können SieLook Ma, No For-Loops: Array Programming With NumPy und diese praktischenNumPy reference lesen.
Gehen Sie weiter und schleifen Sie
Sie verstehen jetzt, wie Sierange()
verwenden und die Einschränkungen umgehen. Sie haben auch eine Vorstellung davon, wie sich diese wichtige Funktion zwischen Python 2 und Python 3 entwickelt hat.
Wenn Sie das nächste Mal eine bestimmte Anzahl von Aktionen ausführen müssen, können Sie Ihr Herz höher schlagen lassen!
Viel Spaß beim Pythoning!