How to use a decimal range() step value? How to use a decimal range() step value? python python

# How to use a decimal range() step value?

Rather than using a decimal step directly, it's much safer to express this in terms of how many points you want. Otherwise, floating-point rounding error is likely to give you a wrong result.

You can use the linspace function from the NumPy library (which isn't part of the standard library but is relatively easy to obtain). `linspace` takes a number of points to return, and also lets you specify whether or not to include the right endpoint:

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

If you really want to use a floating-point step value, you can, with `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])``

Floating-point rounding error will cause problems, though. Here's a simple case where rounding error causes `arange` to produce a length-4 array when it should only produce 3 numbers:

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

Python's range() can only do integers, not floating point. In your specific case, you can use a list comprehension instead:

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

(Replace the call to range with that expression.)

For the more general case, you may want to write a custom function or generator.

Building on 'xrange([start], stop[, step])', you can define a generator that accepts and produces any type you choose (stick to types supporting `+` and `<`):

``>>> 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']>>> ``