1018 Stimmen

Wie verwendet man einen dezimalen Bereich()-Schrittwert?

Gibt es eine Möglichkeit, zwischen 0 und 1 um 0,1 zu wechseln?

Ich dachte, ich könnte es wie folgt machen, aber es hat nicht geklappt:

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

Stattdessen heißt es, dass das Schrittargument nicht Null sein kann, was ich nicht erwartet hatte.

1231voto

Andrew Jaffe Punkte 25296

Anstatt direkt einen Dezimalschritt zu verwenden, ist es viel sicherer, dies in Form der gewünschten Punktzahl auszudrücken. Andernfalls ist es wahrscheinlich, dass ein Fließkomma-Rundungsfehler zu einem falschen Ergebnis führt.

Sie können die linspace Funktion aus der NumPy Bibliothek (die nicht Teil der Standardbibliothek ist, aber relativ leicht zu bekommen ist). linspace nimmt eine Anzahl von Punkten an, die zurückgegeben werden sollen, und lässt Sie außerdem angeben, ob der rechte Endpunkt einbezogen werden soll oder nicht:

>>> np.linspace(0,1,11)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1. ])
>>> np.linspace(0,1,10,endpoint=False)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

Wenn Sie wirklich einen Gleitkomma-Schrittwert verwenden wollen, können Sie mit numpy.arange .

>>> import numpy as np
>>> np.arange(0.0, 1.0, 0.1)
array([ 0. ,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9])

Fließkomma-Rundungsfehler sera verursachen jedoch Probleme. Hier ist ein einfacher Fall, bei dem Rundungsfehler auftreten arange ein Array der Länge 4 zu erzeugen, obwohl es nur 3 Zahlen erzeugen sollte:

>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])

302voto

Pythons range() kann nur ganze Zahlen verarbeiten, keine Fließkommazahlen. In Ihrem speziellen Fall können Sie eine Listenverstehen stattdessen:

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

(Ersetzen Sie den Aufruf von range mit diesem Ausdruck).

Für den allgemeineren Fall möchten Sie vielleicht eine eigene Funktion schreiben oder Generator .

160voto

gimel Punkte 78080

Aufbauend auf xrange([start], stop[, step])' können Sie einen Generator definieren, der jeden beliebigen Typ akzeptiert und erzeugt (bleiben Sie bei Typen, die + y < ):

>>> def drange(start, stop, step):
...     r = start
...     while r < stop:
...         yield r
...         r += step
...         
>>> i0=drange(0.0, 1.0, 0.1)
>>> ["%g" % x for x in i0]
['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1']
>>>

38voto

cmsjr Punkte 52971

Erhöhen Sie das Ausmaß der i für die Schleife und reduzieren Sie sie dann, wenn Sie sie brauchen.

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

EDIT: Ich weiß ehrlich gesagt nicht mehr, warum ich dachte, dass das syntaktisch funktionieren würde.

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

Das sollte das gewünschte Ergebnis bringen.

37voto

Kalle Punkte 13016

NumPy ist ein bisschen übertrieben, denke ich.

[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]

Generell gilt: Um eine Schritt-für-Schritt 1/x bis zu y du würdest tun

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 hat bei meinen Tests weniger Rundungsgeräusche erzeugt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X