我如何在0和1之间迭代0.1步?

这表示step参数不能为零:

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

当前回答

scipy有一个内置的函数arange,它泛化了Python的range()构造函数,以满足您对浮点数处理的需求。

从scipy进口安排

其他回答

下面是一个使用itertools的解决方案:

import itertools

def seq(start, end, step):
    if step == 0:
        raise ValueError("step must not be 0")
    sample_count = int(abs(end - start) / step)
    return itertools.islice(itertools.count(start, step), sample_count)

使用的例子:

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

这里的许多解决方案在Python 3.6中仍然存在浮点错误,并没有完全满足我个人的需求。

下面的函数接受整数或浮点数,不需要导入,也不返回浮点错误。

def frange(x, y, step):
    if int(x + y + step) == (x + y + step):
        r = list(range(int(x), int(y), int(step)))
    else:
        f = 10 ** (len(str(step)) - str(step).find('.') - 1)
        rf = list(range(int(x * f), int(y * f), int(step * f)))
        r = [i / f for i in rf]

    return r

与R的seq函数类似,这个函数在给定正确的步长值的情况下以任意顺序返回一个序列。最后一个值等于停止值。

def seq(start, stop, step=1):
    n = int(round((stop - start)/float(step)))
    if n > 1:
        return([start + step*i for i in range(n+1)])
    elif n == 1:
        return([start])
    else:
        return([])

结果

seq(1, 5, 0.5)

[1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]

seq(10, 0, -1)

[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

seq(10, 0, -2)

[10, 8, 6, 4, 2, 0]

seq(1, 1)

[1]

可以使用Numpy库来完成。Arange()函数允许浮动中的步骤。但是,它返回一个numpy数组,为了方便起见,可以使用tolist()将其转换为列表。

for i in np.arange(0, 1, 0.1).tolist():
   print i

避免四舍五入问题的技巧是使用一个单独的数字在范围内移动,该数字在开始前半步开始。

# floating point range
def frange(a, b, stp=1.0):
  i = a+stp/2.0
  while i<b:
    yield a
    a += stp
    i += stp

另外,numpy。可以使用Arange。