基本上我想从-1到1进去n
步骤,包括-1和1:在Python中编写循环的最优雅方式是什么?
x = -1.0
n = 21
for i in range(n):
print x
x += 0.01
-1.0 -0.9 -0.8 ... 0.8 0.9 1.0
我怎么能写在任何n
价值最优雅,最简单的方法是什么?
基本上我想从-1到1进去n
步骤,包括-1和1:在Python中编写循环的最优雅方式是什么?
x = -1.0
n = 21
for i in range(n):
print x
x += 0.01
-1.0 -0.9 -0.8 ... 0.8 0.9 1.0
我怎么能写在任何n
价值最优雅,最简单的方法是什么?
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
Michael,你为什么要删除这个?我使用这个,它似乎工作。这个有潜在的问题吗? :O – 2012-01-02 03:54:39
@JoanVenge我以为我看到了一个问题,然后在一分钟前重新检查了一下,发现没有问题,所以我将它删除了。 – 2012-01-02 03:55:33
谢谢你,我喜欢这种简单的小技巧。 – 2012-01-02 03:58:17
没有内置的解决方案,但可能解决它是定义自己的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))
你真的应该使用发电机,而不是有创建一个临时列表。 – 2012-01-02 03:38:00
@NiklasBaumstark:你完全正确,我会将它添加到我的回答中 – juliomalegria 2012-01-02 04:00:20
如果它是确定使用numpy
,这工作得很好:
import numpy as np
n = 21
for i in np.linspace(-1, 1, n):
print i
我会
for x in xrange(n):
print float(2*x)/(n-1) - 1
去
有趣的两件事:xrange
比range
更有效率,并且没有ne编辑有两个独立的迭代器变量。
你可以把这个包的功能,如果你发现它经常有用:
def linspace1(n):
for x in xrange(n):
yield float(2*x)/(n-1) - 1
虽然你可能想使下限和上限参数,以及,在julio.alegria的答案。
你说你有你的答案,但我觉得这是一个优雅的解决方案。它还消除了奇怪的浮点问题(至少从定义的范围)的可能性。它结合了生成器的强大功能和灵活性以及字符串格式和浮点值。或者,如果您选择使用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
相关的问题:http://stackoverflow.com/questions/8652006 – juliomalegria 2012-01-02 03:37:13