如何用Python优雅地编写这个呢?

2024-09-28 17:18:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: toinfromfor过程range角度values
3条回答
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方法中有10个步骤返回11个值。在

如果需要其他步骤:

^{pr2}$

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

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

你的麻烦似乎在于翻译:

print values from -startAngle to startAngle (startAngle included)

变成了Python。range可以轻松处理:

^{pr2}$

但是你似乎只需要10个值-这给出了2*startAngle+1值(range(-a, a)有2a个值,这还有一个值),并且放入示例代码将打印出这10次。在

一个正确选择的step参数可以保证它将给出numvalues元素-您希望步骤为未step范围内的值的数目除以所需的值的数目,因为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]

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

from __future__ import division

或者将numvalues设置为10.,执行range(...)而不是{},并执行int(ceil(...))而不是{}。在


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

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

会直接给你想要的。在

相关问题 更多 >