Die Python range () Funktion (Anleitung)

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 Pythonrangefunktioniert

  • Wissen, wie sich die Implementierungen in Python 2 und Python 3 unterscheiden

  • Ich habe eine Reihe von praktischen Beispielen fürrange()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:

  1. range(stop) akzeptiert ein Argument.

  2. range(start, stop) akzeptiert zwei Argumente.

  3. 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 alsstopangegeben 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 obstep1 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 Argumentstepverwenden, 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 Ihrstep25 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:

  1. Ausführen des Körpers einer for-Schleife eine bestimmte Anzahl von Malen

  2. 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 oder0 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!