如何对 range() 使用十进制步长值?

2022-09-05 01:12:29

如何通过 0.1 的步骤在 0 和 1 之间迭代?

这表示 step 参数不能为零:

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

答案 1

与直接使用小数步长相比,用您想要的点数来表示要安全得多。否则,浮点舍入误差可能会给您一个错误的结果。

使用NumPy库中的linspace函数(它不是标准库的一部分,但相对容易获得)。 需要返回多个点,还允许您指定是否包含正确的终结点:linspace

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

如果确实要使用浮点步长值,请使用: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])

但是,浮点舍入错误会导致问题。下面是一个简单的情况,其中舍入错误导致生成长度为 4 的数组,而它只应生成 3 个数字:arange

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

答案 2

range() 只能执行整数,不能执行浮点运算。

请改用列表理解来获取步骤列表:

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

更一般地说,生成器理解可以最大限度地减少内存分配:

xs = (x * 0.1 for x in range(0, 10))
for x in xs:
    print(x)