1

我正在尝试用 Python 编写这个循环,但感到困惑。基本上我有一个起始角度 90,我想使用 -90 到 90 的范围,迭代 10 次。循环完成后,我想将角度除以一半并重复使用 -45 到 45、10 次迭代等的过程。

必须包含结束值,因此 90 是第一个循环的最后一个值,然后 45 是第二个循环的最后一个值,依此类推。

如何在 Python 中优雅高效地编写此代码?

startAngle = 90
for i in range(5):
    for x in range(10):
        print values from -startAngle to startAngle (startAngle included)
    startAngle = startAngle / 2
4

3 回答 3

5
def angles(x):
    return [ i * x / 5 - x for i in xrange(11)]

angles(90)返回[-90, -72, -54, -36, -18, 0, 18, 36, 54, 72, 90]

angles(45)返回[-45, -36, -27, -18, -9, 0, 9, 18, 27, 36, 45]

您现在可以遍历返回值,它是一个列表。

我的方法中有十个步骤angles返回十一个值。

如果您想要其他步骤:

def angles(angle, steps):
    return [ i * angle * 2 / (steps - 1) - angle for i in xrange(steps)]

angles(90, 5)返回[-90, -45, 0, 45, 90]

于 2012-06-15T06:56:54.527 回答
4

你的麻烦似乎是翻译:

print values from -startAngle to startAngle (startAngle included)

进入 Python。range可以轻松处理:

print(list(range(-startAngle, startAngle+1)))

除了您似乎只想要十个值 - 这给出了2*startAngle+1值(range(-a, a)有 2a 值,并且还有一个)并且放入您的示例代码将打印出所有这些十次。

正确选择的step参数 torange可以保证它会给出numvalues元素 - 您希望将步长作为 un- steped 范围内的值数除以您想要的值数,四舍五入因为需要range整数:

print(list(range(-startAngle, startAngle+1, math.ceil((2*startangle+1)/numvalues))

所以, numvalues=10 和 startAngle=45 给你:

list(range(-45, 46, math.ceil((2*45+1)/10)))
[-45, -35, -25, -15, -5, 5, 15, 25, 35, 45]

请注意,我假设您使用的是 Python 3。在 Python 2 中,您可以执行以下操作:

from __future__ import division

或设置numvalues10.、dorange(...)而不是list(range(...))和 doint(ceil(...))而不是达到ceil(...)相同的效果。


如果您需要处理浮点数,另一种方法也可以正常工作,它是使用numpy.linspace - 它需要一个num参数而不是 a step,并且默认情况下包括它的端点 - 所以,

numpy.linspace(-startAngle, startAngle, num=10)

会直接给你你想要的。

于 2012-06-15T07:09:40.733 回答
-2
 def ang_rec(angel):
     for i in range(10):
         if i == 9: ang_rec(angel/2)
         print "do something another"
于 2012-06-15T07:01:44.650 回答