Bereich () für Schwimmer
Gibt es eine range()
äquivalent für Schwimmer in Python?
>>> range(0.5,5,1.5)
[0, 1, 2, 3, 4]
>>> range(0.5,5,0.5)
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
range(0.5,5,0.5)
ValueError: range() step argument must not be zero
InformationsquelleAutor der Frage Jonathan | 2011-09-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, eine eingebaute Funktion, aber zu schreiben wie diese sollte nicht zu kompliziert sein.
Als Sie die Kommentare erwähnen, dies könnte zu unvorhersehbaren Ergebnissen führen wie:
Korrektes Ergebnis zu erhalten, können Sie verwenden Sie eine der anderen Antworten in dieser Frage, oder wie @Tadhg erwähnt, können Sie
decimal.Decimal
alsjump
argument. Stellen Sie sicher, dass eine Initialisierung mit einem string statt einem Schwimmer.Oder auch:
Dann:
InformationsquelleAutor der Antwort kichik
Können Sie entweder:
verwenden oder lambda /anzeigen:
InformationsquelleAutor der Antwort Xaerxess
Ich verwendet, um zu verwenden
numpy.arange
hatte aber einige Komplikationen Kontrolle der Anzahl von Elementen, die es gibt, wegen der floating-point-Fehler. Also ich benutze jetztlinspace
z.B.:InformationsquelleAutor der Antwort wim
Pylab hat
frange
(ein wrapper, der eigentlich fürmatplotlib.mlab.frange
):InformationsquelleAutor der Antwort Pat
Eifrig ausgewertet (2.x
range
):Verzögert ausgewertet (2.x
xrange
3.xrange
):Abwechselnd:
InformationsquelleAutor der Antwort Karl Knechtel
mit
itertools
: träge ausgewertet floating-point-Bereich:InformationsquelleAutor der Antwort Ayush Shanker
Gibt es keine solche eingebaute Funktion, aber Sie können mit der folgenden (Python-3-code), um den job so sicher wie Python ermöglicht.
Können Sie überprüfen Sie es, indem ein paar Behauptungen:
Codes auf GitHub
InformationsquelleAutor der Antwort marcotama
Ich half fügen Sie die Funktion numeric_range dem Paket mehr-itertools.
more_itertools.numeric_range(start, stop, step)
wirkt wie eine eingebaute Funktion range kann aber Griff schwimmt, Dezimal-und Bruch-Typen.InformationsquelleAutor der Antwort William Rusnack
Warum Gibt Es Keine Floating-Point-Bereich-Implementierung In Der Standard-Bibliothek?
Als deutlich gemacht, von allen posts hier, es gibt keine floating-point-version von
range()
. Das heißt, der Verzicht macht Sinn, wenn man bedenkt, dass dierange()
Funktion wird Häufig verwendet, um einen index (und natürlich, das bedeutet, dass ein accessor) generator. Also, wenn wir rufenrange(0,40)
sind wir in der Tat sagen, dass wir wollen, dass 40 Werte beginnend bei 0, bis zu 40, aber nicht-inklusive der 40 sich.Wenn man bedenkt, dass die Generierung von index ist so viel über die Anzahl der Indizes wie es ist, Ihre Werte, die Verwendung eines float-Implementierung von
range()
in der standard-library macht noch weniger Sinn. Wenn wir zum Beispiel die Funktion aufgerufenfrange(0, 10, 0.25)
würden wir erwarten, dass beide 0 und 10 enthalten sein, aber das würde die Ausbeute eines Vektors mit 41 Werten.So, ein
frange()
Funktion je nach Einsatz wird immer zeigen counter-intuitive Verhalten; entweder es hat zu viele Werte in der Wahrnehmung aus der Indizierung Perspektive oder nicht inklusive ist eine Zahl, die angemessen zurückgegeben werden sollen, die aus der mathematischen Perspektive.Die Mathematische Use-Case -
Mit sagte, dass, wie bereits erörtert, ist
numpy.linspace()
führt die generation mit der mathematischen Perspektive schön:Die Indizierung Use-Case -
Und für die Indizierung Perspektive, die ich geschrieben habe, einen etwas anderen Ansatz mit einigen tricksy string-Magie, die es uns ermöglicht das angeben der Anzahl der Dezimalstellen.
Ähnlich, wir können auch das eingebaute
round
Funktion und geben Sie die Anzahl von Dezimalstellen:Einen Schnellen Vergleich & Leistung
Natürlich, angesichts der obigen Diskussion, diese Funktionen haben eine ziemlich begrenzte Verwendung. Trotzdem, hier ein kurzer Vergleich:
Die Ergebnisse sind identisch für jeden:
Und einige timings:
Sieht aus wie der string-Formatierung Methode gewinnt, indem er ein Haar auf meinem system.
Die Einschränkungen
Und schließlich eine demonstration von dem Punkt aus der Diskussion über und noch eine Letzte Einschränkung:
Weiter, wenn die
skip
parameter ist nicht teilbar durch dasstop
Wert, kann es eine gähnende Kluft angesichts der letzteren Frage:Gibt es Möglichkeiten, um dieses Problem zu beheben, aber am Ende des Tages, der beste Ansatz wäre wohl, nur mit Numpy.
InformationsquelleAutor der Antwort Greenstick
Einen Lösung ohne numpy etc Abhängigkeiten wurde von kichik aber aufgrund die floating-point-Arithmetikist es oft verhält sich unerwartet. Wie bereits von mir und blubberdiblubzusätzliche Elemente leicht schleichen sich in das Ergebnis. Zum Beispiel
naive_frange(0.0, 1.0, 0.1)
ergeben würde0.999...
als letzten Wert und damit Ausbeute 11 Werte insgesamt.Eine robuste version ist hier zu sehen:
Weil die Multiplikation, die Rundungsfehler nicht akkumulieren. Die Verwendung von
epsilon
kümmert sich um mögliche Rundungsfehler der Multiplikation, auch wenn Fragen der Kurs steigen könnte in den sehr kleinen und sehr großen endet. Nun, wie erwartet:Und mit etwas größeren zahlen:
Der code ist auch verfügbar als ein GitHub-Gist.
InformationsquelleAutor der Antwort Akseli Palén
schrieb ich eine Funktion zurückgibt, die ein Tupel von einer Reihe von double-precision-floating-point-zahlen ohne Dezimalstellen über die Hundertstel. es war einfach eine Frage der Analyse der range-Werte wie strings und die Abspaltung der exzess. Ich verwende es für eine Anzeige reicht, um von zu wählen, innerhalb eines UI. Ich hoffe, jemand findet es nützlich.
InformationsquelleAutor der Antwort chris mcinnis
Bitte beachten Sie den ersten Buchstaben der Reihe ist Kapital. Diese benennungsmethode wird nicht empfohlen für Funktionen in Python. Sie können den Bereich ändern, um so etwas wie drange oder frange, wenn Sie wollen. Die "Range" - Funktion verhält sich genauso, wie Sie es wollen. Sie können check it Handbuch hier [ http://reference.wolfram.com/language/ref/Range.html ].
InformationsquelleAutor der Antwort Hua Congyi
Ich denke, dass es eine sehr einfache Antwort, die wirklich emuliert alle Funktionen der Reihe, aber für beide float und integer. In dieser Lösung, Sie einfach annehmen, dass deine Annäherung durch Standardwert ist 1e-7 (oder die, die Sie wählen) und Sie können es ändern, wenn Sie die Funktion aufrufen.
InformationsquelleAutor der Antwort Jose Alavedra
Gibt es eine range () - äquivalent für Schwimmer in Python?
KEINE
Verwenden Sie diese:
InformationsquelleAutor der Antwort Grigor Kolev