Как правильно использовать вложенные циклы - PullRequest
0 голосов
/ 18 мая 2019

У меня есть этот вложенный цикл в моем проекте (конечно, он намного сложнее, я просто упростил его, чтобы вы могли понять, что я имею в виду). Я знаю, что в python нет лейбла и goto, я просто хочу показать, что я хочу сделать.

Из строки #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. Как я могу изменить свои петли, чтобы сделать это возможным?

1 Ответ

1 голос
/ 18 мая 2019

Действия типа 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>

Конечный автомат обеспечивает большую гибкость. Кроме того, это не вызовет столько отступов, сколько вложенный цикл. Если сложность становится больше, есть несколько библиотек, которые могут вам помочь. Интересные ссылки на Finite State Machines ( FSM ):

https://python -3-patterns-idioms-test.readthedocs.io / ен / последний / StateMachine.html

https://www.python -course.eu / finite_state_machine.php

...