如何使用decimal range()步长值?

2024-04-25 23:40:02 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法在0和1之间按0.1步进?

我以为我可以像下面这样做,但失败了:

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

相反,它说步骤参数不能为零,这是我没有预料到的。


Tags: infor参数步骤rangeprint办法
3条回答

Python的range()只能做整数,不能做浮点。在特定情况下,您可以使用列表理解代替:

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

(用该表达式替换对range的调用。)

对于更一般的情况,您可能需要编写自定义函数或生成器。

与其直接使用小数步,不如用你想要的点数来表达。否则,浮点舍入误差可能会给出错误的结果。

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

'xrange([start], stop[, step])'的基础上,您可以定义一个生成器,它接受并生成您选择的任何类型(坚持使用支持+<的类型):

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

相关问题 更多 >