2012-01-02 92 views

回答

5
startValue = -1.0 
intervalLength = 2.0 
numberOfSteps = 14 
increasePerStep = intervalLength/numberOfSteps 

print startValue 

x = startValue 
for i in range (numberOfSteps): 
    x += increasePerStep 
    print x 


-1.0 
-0.857142857143 
-0.714285714286 
-0.571428571429 
-0.428571428571 
-0.285714285714 
-0.142857142857 
-2.22044604925e-16 
0.142857142857 
0.285714285714 
0.428571428571 
0.571428571429 
0.714285714286 
0.857142857143 
1.0 
+0

Michael,你为什么要删除这个?我使用这个,它似乎工作。这个有潜在的问题吗? :O – 2012-01-02 03:54:39

+1

@JoanVenge我以为我看到了一个问题,然后在一分钟前重新检查了一下,发现没有问题,所以我将它删除了。 – 2012-01-02 03:55:33

+0

谢谢你,我喜欢这种简单的小技巧。 – 2012-01-02 03:58:17

11

没有内置的解决方案,但可能解决它是定义自己的range功能的好方法:

def my_range(start, end, how_many): 
    incr = float(end - start)/(how_many - 1) 
    return [start + i*incr for i in range(how_many)] 

而且你可以在一个for循环中使用它:

>>> for i in my_range(-1, 1, 10): 
... print i 
... 
-1.0 
-0.777777777778 
-0.555555555556 
-0.333333333333 
-0.111111111111 
0.111111111111 
0.333333333333 
0.555555555556 
0.777777777778 
1 

编辑:正如@NiklasBaumstark建议,如果你的全新my_range功能将处理大量的数字,这可能是一个好主意,使用generators。为此,我们会做一点点修改:

def my_xrange(start, end, how_many): 
     incr = float(end - start)/(how_many - 1) 
     return (start + i*incr for i in xrange(how_many)) 
+6

你真的应该使用发电机,而不是有创建一个临时列表。 – 2012-01-02 03:38:00

+0

@NiklasBaumstark:你完全正确,我会将它添加到我的回答中 – juliomalegria 2012-01-02 04:00:20

11

如果它是确定使用numpy,这工作得很好:

import numpy as np 
n = 21 

for i in np.linspace(-1, 1, n): 
    print i 
3

我会

for x in xrange(n): 
    print float(2*x)/(n-1) - 1 

有趣的两件事:xrangerange更有效率,并且没有ne编辑有两个独立的迭代器变量。

你可以把这个包的功能,如果你发现它经常有用:

def linspace1(n): 
    for x in xrange(n): 
     yield float(2*x)/(n-1) - 1 

虽然你可能想使下限和上限参数,以及,在julio.alegria的答案。

2

你说你有你的答案,但我觉得这是一个优雅的解决方案。它还消除了奇怪的浮点问题(至少从定义的范围)的可能性。它结合了生成器的强大功能和灵活性以及字符串格式和浮点值。或者,如果您选择使用Decimal模块,则可以避免大部分此类问题 - 但这需要稍微调整一下。

def decimal_stepper(start, end, step=0.1): 
    while start <= end: 
     yield float(start) 
     start = float(('%' + str(step) + 'f') % (start+step)) 

一个例子来看:

myVals = decimal_stepper(-1, 1) 
for x in myVals: 
    print x 

,输出:

-1.0 
-0.9 
-0.8 
-0.7 
-0.6 
-0.5 
-0.4 
-0.3 
-0.2 
-0.1 
0.0 
0.1 
0.2 
0.3 
0.4 
0.5 
0.6 
0.7 
0.8 
0.9 
1.0 
相关问题