Wie verwende ich einen Dezimalschrittwert für range()?

Lesezeit: 4 Minuten

Benutzer-Avatar
Evan Fosmark

Wie iteriere ich zwischen 0 und 1 in Schritten von 0,1?

Dies besagt, dass das Schrittargument nicht Null sein kann:

for i in range(0, 1, 0.1):
    print(i)

  • int(0.1) == 0, also ist der Schritt tatsächlich Null. Es mag unerwartet sein, aber es ist null. Vielleicht möchten Sie Ihre Frage wiederholen, um die Tatsache widerzuspiegeln, dass Sie dies nicht erwartet haben. Zu sagen „ist es nicht“ ist falsch und irreführend.

    – S. Lott

    25. Januar 2009 um 13:34 Uhr

  • BTW Ein kurzer Einzeiler kann mit aufgerollt werden itertools.takewhile und itertools.count. Es ist nicht besser als drange leistungsmäßig allerdings.

    – Kos

    29. November 2012 um 16:15 Uhr

  • Es ist peinlich, dass die Reichweite von Python dies nicht zulässt, wenn man bedenkt, wie einfach es ist, einen Generator zu implementieren, der dies auch ohne Anhäufung von Rundungsfehlern tut. Verdammt, sogar die seq Tool in GNU Coreutils ermöglicht es einem, dies zu tun seq 0 0.1 1 ohne Rundungsfehler!

    – josch

    20. August 2016 um 5:55 Uhr

  • @josch: seq verwendet das C long double Typ intern, und ist Rundungsfehler vorbehalten. Zum Beispiel auf meiner Maschine, seq 0 0.1 1 gibt 1 als letzte Ausgabe (wie erwartet), aber seq 1 0.1 2 gibt 1.9 als letzte Ausgabe (anstelle der erwarteten 2).

    – Mark Dickinson

    24. Oktober 2017 um 18:39 Uhr


  • Der Einfachheit halber kann der Vorschlag von @ Kos implementiert werden als itertools.takewhile(lambda x: (x+0.05)<1, itertools.count(0,0.1)) oder itertools.islice(itertools.count(0,0.1), 10) (nachdem du hast import itertools), obwohl ich nicht getestet habe, was effizienter ist

    – Anonym

    19. September 2019 um 14:13 Uhr


range() kann nur Ganzzahlen, keine Fließkommazahlen.

Verwenden ein Listenverständnis Stattdessen erhalten Sie eine Liste der Schritte:

[x * 0.1 for x in range(0, 10)]

Allgemeiner, a Generator Verständnis minimiert Speicherzuweisungen:

xs = (x * 0.1 for x in range(0, 10))
for x in xs:
    print(x)

  • Noch besser, Sie könnten einfach ein Generatorverständnis verwenden, wenn Sie mit Python 2.4+ arbeiten. (x * 0.1 for x in range(0, 10)).

    – JAB

    25. Juni 2010 um 18:02 Uhr


  • Eben besser gesagt x/10 Anstatt von x * 0.1 😀 Eigentlich nichts Besonderes, aber einige Zahlen darin werden genauer sein, zB für 3*0.1 du erhältst 0.30000000000000004während Sie für 3/10 erhalten 0.3 🙂

    – Alter

    26. Mai 2012 um 18:22 Uhr


  • 3/10 gibt mir 0, nicht 0,3. 3/10,0 ergibt 0,29999999999999999. Python 2.6.

    Benutzer25148

    27. Mai 2012 um 8:19 Uhr

  • @LarsWirzenius: in Python 2.2+, from __future__ import division; 3/10 ergibt 0,3. Dieses Verhalten ist die Standardeinstellung in Python 3.x.

    – Benjamin Hodgson

    14. September 2012 um 11:15 Uhr

  • round-Funktion kann auch verwendet werden lst = [round(x* 0.10,2) for x in range(0,10)]

    – KENNZEICHEN

    30. Januar 2014 um 8:34 Uhr


  • Das hat Rundungsprobleme. Bitte schauen Sie hier: code.activestate.com/recipes/66472

    – Christian Ouard

    12. Oktober 2009 um 20:50 Uhr

  • Ich würde es für die andere Richtung etwas erweitern mit einem (while r > stop) und einem entsprechenden r -= Schritt, um die entgegengesetzte Richtung anzugeben.

    – Benutzer318904

    8. November 2010 um 3:59 Uhr

  • Ich habe eine Xfrange-Funktion ohne die oben genannten Float-Präzisionsprobleme ausgeführt. Probieren Sie es aus;) stackoverflow.com/questions/477486/…

    – Carlos Vega

    12. Dezember 2013 um 17:05 Uhr


  • Sie häufen Rundungsfehler an. Bitte verwenden Sie stattdessen Folgendes: ` i = 0; r = start während r < stop: i += 1; r = Start + i * Schritt; Ausbeute r`

    – Cees Timmermann

    11. April 2016 um 11:56 Uhr

  • Das ist von pythoncentral.io/pythons-range-function-explained (und andere Python-Dokumentationsquellen)

    – Apostolos

    5. Januar 2018 um 17:31 Uhr

Benutzer-Avatar
cmsjr

Erhöhen Sie die Größe von i für die Schleife und reduzieren Sie es dann, wenn Sie es brauchen.

for i * 100 in range(0, 100, 10):
    print i / 100.0

EDIT: Ich kann mich ehrlich gesagt nicht erinnern, warum ich dachte, das würde syntaktisch funktionieren

for i in range(0, 11, 1):
    print i / 10.0

Das sollte die gewünschte Ausgabe haben.

  • Ich denke, Sie werden feststellen, dass range() mit ganzen Zahlen funktioniert. In diesem Fall wäre dies die einzige Lösung, wenn Sie zumindest dieselbe Funktion verwenden.

    – Matthew Scharley

    25. Januar 2009 um 10:33 Uhr

  • @cmsjr creative 😀 Nur eine Kleinigkeit: Teilen Sie durch 100,0, damit Python das Ergebnis nicht abschneidet, wenn Sie Python 2.x verwenden. Ich denke, in 3.0 wird es so funktionieren, wie Sie es codiert haben.

    – Dana

    25. Januar 2009 um 10:35 Uhr

  • for i * 100 in range(0, 100, 10): Syntaxfehler: Operator kann nicht zugewiesen werden

    – Anne van Rossum

    6. Januar 2015 um 15:02 Uhr

Benutzer-Avatar
Kalle

NumPy ist meiner Meinung nach etwas übertrieben.

[p/10 for p in range(0, 10)]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

Im Allgemeinen, um eine Schritt-für-1/x bis zu y Du würdest

x=100
y=2
[p/x for p in range(0, int(x*y))]
[0.0, 0.01, 0.02, 0.03, ..., 1.97, 1.98, 1.99]

(1/x erzeugte beim Testen weniger Rundungsgeräusche).

  • Ich denke, Sie werden feststellen, dass range() mit ganzen Zahlen funktioniert. In diesem Fall wäre dies die einzige Lösung, wenn Sie zumindest dieselbe Funktion verwenden.

    – Matthew Scharley

    25. Januar 2009 um 10:33 Uhr

  • @cmsjr creative 😀 Nur eine Kleinigkeit: Teilen Sie durch 100,0, damit Python das Ergebnis nicht abschneidet, wenn Sie Python 2.x verwenden. Ich denke, in 3.0 wird es so funktionieren, wie Sie es codiert haben.

    – Dana

    25. Januar 2009 um 10:35 Uhr

  • for i * 100 in range(0, 100, 10): Syntaxfehler: Operator kann nicht zugewiesen werden

    – Anne van Rossum

    6. Januar 2015 um 15:02 Uhr

Benutzer-Avatar
Katharina Ray

scipy hat eine eingebaute Funktion arange was Pythons verallgemeinert range() Konstrukteur, um Ihre Anforderungen an die Handhabung von Schwimmern zu erfüllen.

from scipy import arange

  • Das ist eigentlich genau das gleiche arange Sie können in numpy finden: >>> import scipy >>> import numpy >>> numpy.arange is scipy.arange wird zurückkehren True.

    – iFreilicht

    10. Juli 2017 um 11:17 Uhr

1144070cookie-checkWie verwende ich einen Dezimalschrittwert für range()?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy