select for 循环中的第 n 个列表项
select first nth list items within a for loop
我目前拥有的是下面的循环,它依次点亮 24 根灯串上的每个 LED。
while True:
for i in range(24):
pixels = [ (0,0,0) ] * numLEDs
pixels[i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
我想要的是之前点亮的 LED 在每次迭代中都保持亮起。所以每次点亮的LED数量都会增加一个。
我假设我可以简单地 select 从列表的开头到第 i 项,如下所示。
然而这个returns一个"TypeError: 'int' object is not iterable".
我不是很清楚为什么这不起作用。
while True:
for i in range(24):
pixels = [ (0,0,0) ] * numLEDs
pixels[:i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
我已经引起你的注意了,除了使用 time.sleep() 之外,还有更好的方法来为这些循环计时吗?虽然我正在使用线程,但当 LED 模式发生变化时,睡眠仍然会导致一些延迟。
问题是您将永远用全零覆盖当前像素状态。如果您在无限 while
循环之外定义像素结构,然后一次只调整一个像素结构,它应该可以解决您的问题。尝试这样的事情:
numLEDs = 24
pixels = [ (0,0,0) ] * numLEDs
while True:
for i in range(numLEDs):
pixels[i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
在您的第一个示例中,循环通过将 LED 设置为 (0,0,0) 来关闭 LED。相反,为什么不使用这个:
while True:
for i in range(24):
pixels = [ (100,100,100) ] * (i) + [ (0,0,0) ] * (numLEDs - i)
client.put_pixels(pixels)
time.sleep(0.02)
这会将列表的前 i
个元素设置为 (100,100,100),然后将其余元素设置为 (0,0,0)。
如果 i = 5 且 numLEDs = 15,您将得到以下输出:
[(100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]
如您所见,这将使其他人保持打开状态。
这是一个解决始终打开两个连续 LED 的任务的答案,因此如果您将 LED 阵列安装成圆形,您会看到一个双光以大约 2 Hz 的频率在圆上移动。
我在对 OP 有效询问的错误印象下回答,我给出了另一个解决真正问题的答案,但我想把这个答案留在这里,因为它有它的美,至少在旁观者的眼中.. .
您想使用简单的模块算法来计算,哪个 LED 必须关闭,哪个 LED 必须打开,使用我们从部分点亮开始的技巧(我希望它在您的要求下是允许的)板.
# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24
# initial state of the leds
px = [ OFF ] * N
client.put_pixels(px) # no leds on
# set initial conditions for the iteration
px[0] = ON
n = -1
# the never-ending loop
while True:
n +=1
i, j = (n-1)%N, (n+1)%N
px[i], px[j] = OFF, ON
client.put_pixels(px)
time.sleep(0.02)
在第 1 次迭代之前,您在 px
列表中将 0 点亮,在第 1 次迭代之后,您有 2 个 LED 点亮,在所有进一步的迭代中,您将一个 LED 关闭并打开另一个 LED,因此每时每刻你都有2个led。
如果你想按顺序点亮所有 LED,然后立即关闭它们等等等等......等等
# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24
n = 0
while 1:
if n%N == 0:
px = [ OFF ] * N
client.put_pixels(px)
time.sleep(0.02)
px[n%N] = ON
client.put_pixels(px)
time.sleep(0.02)
n += 1
我目前拥有的是下面的循环,它依次点亮 24 根灯串上的每个 LED。
while True:
for i in range(24):
pixels = [ (0,0,0) ] * numLEDs
pixels[i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
我想要的是之前点亮的 LED 在每次迭代中都保持亮起。所以每次点亮的LED数量都会增加一个。
我假设我可以简单地 select 从列表的开头到第 i 项,如下所示。 然而这个returns一个"TypeError: 'int' object is not iterable".
我不是很清楚为什么这不起作用。
while True:
for i in range(24):
pixels = [ (0,0,0) ] * numLEDs
pixels[:i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
我已经引起你的注意了,除了使用 time.sleep() 之外,还有更好的方法来为这些循环计时吗?虽然我正在使用线程,但当 LED 模式发生变化时,睡眠仍然会导致一些延迟。
问题是您将永远用全零覆盖当前像素状态。如果您在无限 while
循环之外定义像素结构,然后一次只调整一个像素结构,它应该可以解决您的问题。尝试这样的事情:
numLEDs = 24
pixels = [ (0,0,0) ] * numLEDs
while True:
for i in range(numLEDs):
pixels[i] = (100, 100, 100)
client.put_pixels(pixels)
time.sleep(0.02)
在您的第一个示例中,循环通过将 LED 设置为 (0,0,0) 来关闭 LED。相反,为什么不使用这个:
while True:
for i in range(24):
pixels = [ (100,100,100) ] * (i) + [ (0,0,0) ] * (numLEDs - i)
client.put_pixels(pixels)
time.sleep(0.02)
这会将列表的前 i
个元素设置为 (100,100,100),然后将其余元素设置为 (0,0,0)。
如果 i = 5 且 numLEDs = 15,您将得到以下输出:
[(100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (100, 100, 100), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)]
如您所见,这将使其他人保持打开状态。
这是一个解决始终打开两个连续 LED 的任务的答案,因此如果您将 LED 阵列安装成圆形,您会看到一个双光以大约 2 Hz 的频率在圆上移动。
我在对 OP 有效询问的错误印象下回答,我给出了另一个解决真正问题的答案,但我想把这个答案留在这里,因为它有它的美,至少在旁观者的眼中.. .
您想使用简单的模块算法来计算,哪个 LED 必须关闭,哪个 LED 必须打开,使用我们从部分点亮开始的技巧(我希望它在您的要求下是允许的)板.
# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24
# initial state of the leds
px = [ OFF ] * N
client.put_pixels(px) # no leds on
# set initial conditions for the iteration
px[0] = ON
n = -1
# the never-ending loop
while True:
n +=1
i, j = (n-1)%N, (n+1)%N
px[i], px[j] = OFF, ON
client.put_pixels(px)
time.sleep(0.02)
在第 1 次迭代之前,您在 px
列表中将 0 点亮,在第 1 次迭代之后,您有 2 个 LED 点亮,在所有进一步的迭代中,您将一个 LED 关闭并打开另一个 LED,因此每时每刻你都有2个led。
如果你想按顺序点亮所有 LED,然后立即关闭它们等等等等......等等
# constants
ON = (100, 100, 100)
OFF = (0, 0, 0)
N = 24
n = 0
while 1:
if n%N == 0:
px = [ OFF ] * N
client.put_pixels(px)
time.sleep(0.02)
px[n%N] = ON
client.put_pixels(px)
time.sleep(0.02)
n += 1