У меня есть этот вложенный цикл в моем проекте (конечно, он намного сложнее, я просто упрощаю его, чтобы вы могли понять, что я имею в виду). Я знаю, что в python нет ярлыка и перехода, я просто хочу показать, что я хочу сделать.
С линии #goto third
я хочу вернуться туда, где вы можете видеть #label third
.
Я пробовал разные настройки своих циклов, но они никогда не делали то, что я хочу.
import time
onoff = "on"
t=0
while onoff == "on":
#label first
for x in range (5):
print("first loop")
time.sleep(1)
for y in range (5):
print("second loop")
time.sleep(1)
p = 0 #for testing
t=0 #for testing
if p != 5:
if t == 0:
print("third loop")
time.sleep(1)
p2 = 5 #for testing
t=0
if p2 != 5: #label third
if t == 0:
print("go back to first loop")
time.sleep(1)
#goto first
else:
print("lock")
#lock.acquire()
else:
if t == 0:
print("go back to third loop")
p2 = 3
time.sleep(1)
#goto third
else:
print("lock")
#lock.acquire()
else:
print("lock")
#lock.acquire()
Кажется, что каждый путь в этом вложенном цикле работает нормально, но я хочу, чтобы мой цикл возвращался к #label third
из #goto third
и сначала возвращался к #label. Как я могу изменить свои циклы, чтобы это стало возможным?
Такие действия, как goto first
, которые разрывают цикл for, являются злом во многих отношениях. While
циклы более элегантны, но, возможно, вам лучше подойдет решение, подобное «автомату». Что-то типа:
state = 0
while is_on:
if state == 0: # do outer loop things
<do things>
state = 1 # to do inner loop things
elif state == 1:
n = 0
# do inner loop things
n += 1
if n == 5:
state = 0
elif state == 2: # do even more nested things
p = 0
if <some condition>:
state = 0
p += 1
if p == 5:
state = <whatever>
Конечный автомат обеспечивает гораздо большую гибкость. Кроме того, это не вызовет такого большого отступа, как вложенный цикл. Если сложность становится больше, есть несколько библиотек, которые могут вам помочь. Интересные ссылки по конечным автоматам (ФШМ):
https://python-3-patterns-idioms-test.readthedocs.io/en/latest/StateMachine.html
https://www.python-course.eu/finite_state_machine.php
Да, я думаю, что я могу сделать это, используя этот метод. Спасибо.
В конечном итоге он должен будет перейти от
goto third
кlabel first
, когда циклfor y in range(5)
завершится для каждого x. Если вы хотите больше контроля цикла, я предлагаю использоватьwhile
вместоfor