¿Cómo uso un valor de paso decimal para el rango()?
¿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)
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 linspace
función de la biblioteca NumPy (que no forma parte de la biblioteca estándar pero es relativamente fácil de obtener). linspace
toma 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 arange
que 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])
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)
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']
>>>
Aumente la magnitud del i
bucle 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.