Как правильно использовать вложенные циклы

У меня есть этот вложенный цикл в моем проекте (конечно, он намного сложнее, я просто упрощаю его, чтобы вы могли понять, что я имею в виду). Я знаю, что в 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 third к label first, когда цикл for y in range(5) завершится для каждого x. Если вы хотите больше контроля цикла, я предлагаю использовать while вместо for

But I'm Not A Wrapper Class 18.05.2019 16:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Такие действия, как 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

Да, я думаю, что я могу сделать это, используя этот метод. Спасибо.

ostry0728 18.05.2019 22:37

Другие вопросы по теме