如何在while语句中的所有子语句都执行完之后才中断while语句



我有这个代码,我想在if, elif and elif一个接一个地执行完之后才突破while。但是,如果我在elif之后有一个break语句,如图所示,while循环在执行IF之后中断。我该怎么做?

time_end = time.time() + 3
tm_end = time.time() + 6
t_end = time.time() + 13
while time.time() <= t_end:
if time.time() <= time_end:
change_state(7)

elif time.time() <= tm_end:
change_state(2)

elif time.time() <= t_end:
change_state(8)
break

可能的解决方案之一:

time_end = time.time() + 3
tm_end = time.time() + 6
t_end = time.time() + 13
flag = [0, 0, 0]
while time.time() <= t_end:
if time.time() <= time_end:
change_state(7)
flag[0]  = 1

elif time.time() <= tm_end:
change_state(2)
flag[1] = 1

elif time.time() <= t_end:
change_state(8)
flag[2] = 1
if sum(flag) == 3:
break

我添加了一个列表flag,它仅在所有if/elif语句至少执行一次时才结束while循环。

您可能想要这个FSM。请注意,比较符号是颠倒的。

counter = 0
while counter != 3:
t = time.time()
if counter == 0 and t >= time_end:
change_state(7)
counter = 1

if counter == 1 and t >= tm_end:
change_state(2)
counter = 2

if counter == 2 and t >= t_end:
change_state(8)
counter = 3

一种更简单的写入方式:

transitions = [time_end, tm_end, t_end]
states = [7, 2, 8]
counter = 0
while counter != 3:
t = time.time()
if t >= transitions[counter]:
change_state(states[counter])
counter += 1

sleep(POLL_RATE)放入循环中可能也是一个好主意,以防止占用所有忙于等待的CPU时间。

我认为您只需要缩进中断,如下所示:

time_end = time.time() + 3
tm_end = time.time() + 6
t_end = time.time() + 13
while time.time() <= t_end:
if time.time() <= time_end:
change_state(7)

elif time.time() <= tm_end:
change_state(2)

elif time.time() <= t_end:
change_state(8)
elif time.time() == t_end 
break # break when the end of time.time() is reached

您可以使用for循环来迭代时间增量,并与相应的状态配对,然后使用while循环来不断更改状态,直到时间增量到期:

start = time.time()
for delta, state in (3, 7), (6, 2), (13, 8):
while time.time() - start <= delta:
change_state(state)

最新更新