0

Эквивалент GOTO в Python

57

Заголовок: Как выполнить переход по метке (GOTO) в Python?

Я самостоятельно изучаю Python 2.7 и у меня есть некоторый опыт в использовании BATCH, где присутствет оператор GOTO. Как я могу реализовать аналогичную функциональность в Python? Например, как можно прыгнуть с 5-й строки на 18-ю?

Я понимаю, что ранее задавались вопросы по этой теме, но я не нашел из них достаточно информативных или слишком сложных для моего текущего уровня владения Python.

3 ответ(ов)

0

Понимаю, что иногда трудно устоять перед интересом к программированию, так что давайте разберем ваш код.

Ваш код реализует бесконечный цикл с направлением управления в зависимости от пользовательского ввода (да или нет). Функция goto меняет значение глобальной переменной line, что позволяет управлять потоком выполнения программы. Однако такой подход может вызвать трудности с читаемостью и поддерживаемостью кода.

Вот пояснение по каждой части вашего кода:

  1. Глобальная переменная: Вы объявляете переменную line как глобальную, чтобы управлять потоком программы из разных частей кода.

  2. Ввод данных: В зависимости от ответа пользователя (yes или no), программа переходит на соответствующий "линейный номер".

  3. Обработка ответов:

    • Если пользователь ввел "yes", программа выводит "Thank you for the yes!" и снова меняет номер линии.
    • Если "no" — то выводится "Thank you for the no!" и тоже происходит переход.
    • Если введено что-то другое, выводится сообщение об ошибке и программа возвращается к запросу ответа.
  4. Выход из цикла: Цикл завершается, когда управление переходит на line = 20.

  5. Неудовлетворительный ввод: При повторной попытке есть обработка, когда программа выводит сообщение "You're annoying me - answer the question!" и возвращается к началу.

Теперь, если вы хотите сделать ваш код более читаемым и избежать использования глобальных переменных, я бы предложил использовать структуру, например, функции или классы. Это сделает ваш код более модульным и понятным.

Если у вас есть дополнительные вопросы или вы хотите улучшить свой код, дайте знать!

0

Предупреждение: Я был подвержен значительному количеству F77.

Современный аналог goto (хоть это и спорно, только моё мнение и т.д.) — это явная обработка исключений.

Отредактировано, чтобы лучше подчеркнуть повторное использование кода.

Предположим, есть псевдокод на фальшивом языке, похожем на Python с goto:

def myfunc1(x)
    if x == 0:
        goto LABEL1
    return 1/x

def myfunc2(z)
    if z == 0:
        goto LABEL1
    return 1/z

myfunc1(0) 
myfunc2(0)

:LABEL1
print 'Нельзя делить на ноль'.

В сравнении с Python:

def myfunc1(x):
    return 1/x

def myfunc2(y):
    return 1/y

try:
    myfunc1(0)
    myfunc2(0)
except ZeroDivisionError:
    print 'Нельзя делить на ноль'

Явные именованные исключения — это значительно лучший способ справиться с нелинейной условной ветвлением.

0

Ваш код использует бесконечный цикл для получения ответа пользователя на вопрос, нравится ли ему пирог. Вот его перевод на русский в стиле ответа на StackOverflow:

answer = None
while True:
    answer = input("Вам нравится пирог? ")  # Используйте input() вместо raw_input() в Python 3
    if answer in ("да", "нет"): 
        break
    print("Это не да и не нет.")

Этот код эффективно запрашивает у пользователя ответ и продолжает спрашивать, пока не будет введено либо "да", либо "нет". Он не использует оператор goto, что делает его простым и понятным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь