以不同步长增加和减少的循环

0 投票
4 回答
1855 浏览
提问于 2025-04-17 21:16

我想做一个简单的循环,让不同的数值以不同的步长增加和减少,直到某个时间结束。

举个例子:

(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

根据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)
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]
>>> 
0

你设置的规则是,如果当前值小于StopValue,就增加一点;如果大于StopValue,就减少一点。这样做的结果是,值会一直保持在StopValue附近,因为一旦偏离就会有强烈的“拉回”效果。

你需要调整你的算法,让它有点“滑动”的效果。这里只是一个算法的简单描述,基本上你要设定一个正向和负向的限制,并且记录当前的方向。只要你的值在你设定的范围内,也就是-n*step_size <= offset <= n*step_size,其中n是你允许的从中心偏离的步数,你就不需要改变方向。只有当你走出这个范围时,才会改变方向。

2

试着用下面这种语法来使用 range -

range(start, end, step_size)

撰写回答