步长为浮点数的范围
文档基本上说,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 提醒 =)