如何在Python中优雅地编写这个?

时间:2012-06-15 06:51:58

标签: python loops iteration

我试图在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

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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正确选择的range参数可以保证它会提供numvalues个元素 - 您希望该步骤为联合国中step的值数量ed范围除以您想要的值的数量,因为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

或将numvalues设置为10.,执行range(...)代替list(range(...)),并执行int(ceil(...))代替ceil(...)达到同样的效果。


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

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

会直接给你你想要的东西。

答案 2 :(得分:-2)

 def ang_rec(angel):
     for i in range(10):
         if i == 9: ang_rec(angel/2)
         print "do something another"