¿Cómo uso un valor de paso decimal para el rango()?

Resuelto Evan Fosmark asked hace 15 años • 34 respuestas

¿Cómo itero entre 0 y 1 en un paso de 0,1?

Esto dice que el argumento del paso no puede ser cero:

for i in range(0, 1, 0.1):
    print(i)
Evan Fosmark avatar Jan 25 '09 17:01 Evan Fosmark
Aceptado

En lugar de usar un paso decimal directamente, es mucho más seguro expresarlo en términos de cuántos puntos deseas. De lo contrario, es probable que un error de redondeo de punto flotante le dé un resultado incorrecto.

Utilice la linspacefunción de la biblioteca NumPy (que no forma parte de la biblioteca estándar pero es relativamente fácil de obtener). linspacetoma una cantidad de puntos para devolver y también le permite especificar si se incluye o no el punto final correcto:

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

Si realmente desea utilizar un valor de paso de punto flotante, utilice 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])

Sin embargo, el error de redondeo de punto flotante causará problemas. A continuación se muestra un caso simple en el que un error de redondeo provoca arangeque se produzca una matriz de longitud 4 cuando solo debería producir 3 números:

>>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])
Andrew Jaffe avatar Jan 25 '2009 12:01 Andrew Jaffe

range()Sólo puede hacer números enteros, no punto flotante.

Utilice una lista de comprensión en su lugar para obtener una lista de pasos:

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

De manera más general, la comprensión de un generador minimiza las asignaciones de memoria:

xs = (x * 0.1 for x in range(0, 10))
for x in xs:
    print(x)
 avatar Jan 25 '2009 10:01

Basándose en 'xrange([start], stop[, step])' , puede definir un generador que acepte y produzca cualquier tipo que elija (siga los tipos que admiten +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']
>>> 
gimel avatar Jan 25 '2009 11:01 gimel

Aumente la magnitud del ibucle y luego redúzcala cuando lo necesite.

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

EDITAR: Sinceramente, no recuerdo por qué pensé que funcionaría sintácticamente

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

Eso debería tener el resultado deseado.

cmsjr avatar Jan 25 '2009 10:01 cmsjr