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)
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)
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.30000000000000004
wä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
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
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
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
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
unditertools.count
. Es ist nicht besser alsdrange
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 tunseq 0 0.1 1
ohne Rundungsfehler!– josch
20. August 2016 um 5:55 Uhr
@josch:
seq
verwendet das Clong double
Typ intern, und ist Rundungsfehler vorbehalten. Zum Beispiel auf meiner Maschine,seq 0 0.1 1
gibt1
als letzte Ausgabe (wie erwartet), aberseq 1 0.1 2
gibt1.9
als letzte Ausgabe (anstelle der erwarteten2
).– 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))
oderitertools.islice(itertools.count(0,0.1), 10)
(nachdem du hastimport itertools
), obwohl ich nicht getestet habe, was effizienter ist– Anonym
19. September 2019 um 14:13 Uhr