步长为浮点数的范围

51 投票
8 回答
126109 浏览
提问于 2025-04-16 07:07

文档基本上说,range的行为必须和这个实现完全一致(对于正的step来说):

def range(start, stop, step):
  x = start
  while True:
    if x >= stop: return
    yield x
    x += step

文档还提到,它的参数必须是整数。为什么会这样呢?如果step是浮点数,这个定义不也完全有效吗?

在我的情况下,我特别需要一个range函数,它可以接受浮点数作为step参数。在Python中有这样的函数吗,还是我需要自己实现一个?


更具体一点:我该如何将这段C代码直接优雅地翻译成Python(也就是说,不只是通过手动的while循环来实现):

for(float x = 0; x < 10; x += 0.5f) { /* ... */ }

8 个回答

13

如果你想在一个范围表达式中使用小数,有一个很不错的方法就是这样写:
[x * 0.1 for x in range(0, 10)]

这里的意思是,我们用一个循环来生成从0到9的数字,然后每个数字都乘以0.1,这样就得到了0.0到0.9之间的小数。这个方法很简单又好用!

36

一种可能的解释是浮点数的四舍五入问题。举个例子,如果你调用了

range(0, 0.4, 0.1)

你可能会期待得到这样的输出

[0, 0.1, 0.2, 0.3]

但实际上你得到的可能是类似这样的结果

[0, 0.1, 0.2000000001, 0.3000000001]

这是因为四舍五入的问题。而且,由于范围通常用于生成某种索引,所以它只会生成整数。

不过,如果你想要一个可以生成浮点数范围的工具,你可以自己写一个。

def xfrange(start, stop, step):
    i = 0
    while start + i * step < stop:
        yield start + i * step
        i += 1
53

你可以使用 numpy.arange 这个工具。

补充说明:文档更推荐使用 numpy.linspace感谢 @Droogans 提醒 =)

撰写回答