我有这个代码,我想在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)