如何为 range() 使用小数步长值?

新手上路,请多包涵

如何以 0.1 的步长在 0 和 1 之间进行迭代?

这表示 step 参数不能为零:

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

原文由 Evan Fosmark 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.8k
2 个回答

与其直接使用小数步长,不如用你想要的点数来表达这一点要安全得多。否则,浮点舍入错误很可能会给你一个错误的结果。

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

但是,浮点舍入误差 导致问题。这是一个简单的情况,舍入错误导致 arange 产生一个长度为 4 的数组,而它应该只产生 3 个数字:

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

原文由 Andrew Jaffe 发布,翻译遵循 CC BY-SA 4.0 许可协议

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)

原文由 user25148 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题