通过不同的步骤循环增加和减少

时间:2014-03-07 09:11:37

标签: python

我想做一些简单的循环,它会增加和减少不同的值 步长直到某个时间到期。

例如:

(1)第一个变量,范围从10到20,步骤1

(2)第二个变量,范围从20到30,步骤2

(3)第三个变量,范围从30到40,步骤3

(4)第四个变量,范围从10到50,步骤5

  

(1)10 11 ... 20 19 ... 10 ...

     

(2)20 22 ... 30 28 ... 20 ...

     

(3)30 33 ... 39 36 ... 30 ......

     

(4)10 15 ... 50 45 ... 10 ...

问题出在elif行,但我不知道如何重建这段代码。任何人都可以帮助我吗?

我的代码:

for i in range(4):
    aHO.setBlock((i + 1), startValue[i])

while time.time() < end:
    for i in range (4):
        if actualValue[i] <= stopValue[i] - stepSize[i]:
            actualValue[i] = actualValue[i] + stepSize[i]
            aHO.setBlock((i + 1), actualValue[i])
        elif actualValue[i] > stopValue[i] - stepSize[i]:
            actualValue[i] = actualValue[i] - stepSize[i]
            aHO.setBlock((i + 1), actualValue[i])

time.sleep(float(timeInterval) / 1000)

一切正常,直到价值接近止损值,然后价值正在下降,但只有一次,然后只增加一次,依此类推。例如

  

1 2 3 ... 9 10 9 10 9 10 ...

4 个答案:

答案 0 :(得分:1)

尝试使用以下语法中的范围 -

range(start, end, step_size)

答案 1 :(得分:0)

如果它小于StopValue( - 一步大小),则将其设置为递增,如果大于StopValue(+一步大小),则递减。这往往会使它在StopValue上保持正确,因为你会从徘徊中获得强烈的负面反馈。

您需要将算法更改为“滑动” - 这只是算法的草图,但您希望基本上设置正面&amp;负限制,并添加当前方向。只要您处于所需范围内,即-n*step_size <= offset <= n*step_size,其中n是您允许从中心执行的步数,您就不会修改方向。在超出此范围之前,不要修改方向。

答案 2 :(得分:0)

您可以使用它来生成所需的值:

>>> from itertools import chain
>>> list(chain(xrange(10, 20, 1), xrange(20, 9, -1)))
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10]
>>> list(chain(xrange(20, 30, 2), xrange(30, 19, -2)))
[20, 22, 24, 26, 28, 30, 28, 26, 24, 22, 20]
>>> list(chain(xrange(30, 40, 3), xrange(39, 29, -3)))
[30, 33, 36, 39, 39, 36, 33, 30]
>>> list(chain(xrange(10, 50, 5), xrange(50, 9, -5)))
[10, 15, 20, 25, 30, 35, 40, 45, 50, 45, 40, 35, 30, 25, 20, 15, 10]
>>> 

答案 3 :(得分:0)

根据warwaruk的方法,这应该做的工作:

from itertools import chain
def get_next(start, stop, step)
    while True:
        for j in list(chain(xrange(start, stop, step), xrange(stop, start-1, -step))):
            yield j

while time.time() < end:
    for actualValues in zip(
        get_next(10,20,1),
        get_next(20,30,2),
        get_next(30,40,3),
        get_next(10,50,5)
    ):
    for i,actualValue in enumerate(values):
        aHO.setBlock((i + 1), actualValue)