Эквивалент GOTO в Python
Заголовок: Как выполнить переход по метке (GOTO) в Python?
Я самостоятельно изучаю Python 2.7 и у меня есть некоторый опыт в использовании BATCH, где присутствет оператор GOTO. Как я могу реализовать аналогичную функциональность в Python? Например, как можно прыгнуть с 5-й строки на 18-ю?
Я понимаю, что ранее задавались вопросы по этой теме, но я не нашел из них достаточно информативных или слишком сложных для моего текущего уровня владения Python.
3 ответ(ов)
Понимаю, что иногда трудно устоять перед интересом к программированию, так что давайте разберем ваш код.
Ваш код реализует бесконечный цикл с направлением управления в зависимости от пользовательского ввода (да или нет). Функция goto
меняет значение глобальной переменной line
, что позволяет управлять потоком выполнения программы. Однако такой подход может вызвать трудности с читаемостью и поддерживаемостью кода.
Вот пояснение по каждой части вашего кода:
Глобальная переменная: Вы объявляете переменную
line
как глобальную, чтобы управлять потоком программы из разных частей кода.Ввод данных: В зависимости от ответа пользователя (
yes
илиno
), программа переходит на соответствующий "линейный номер".Обработка ответов:
- Если пользователь ввел "yes", программа выводит "Thank you for the yes!" и снова меняет номер линии.
- Если "no" — то выводится "Thank you for the no!" и тоже происходит переход.
- Если введено что-то другое, выводится сообщение об ошибке и программа возвращается к запросу ответа.
Выход из цикла: Цикл завершается, когда управление переходит на
line = 20
.Неудовлетворительный ввод: При повторной попытке есть обработка, когда программа выводит сообщение "You're annoying me - answer the question!" и возвращается к началу.
Теперь, если вы хотите сделать ваш код более читаемым и избежать использования глобальных переменных, я бы предложил использовать структуру, например, функции или классы. Это сделает ваш код более модульным и понятным.
Если у вас есть дополнительные вопросы или вы хотите улучшить свой код, дайте знать!
Предупреждение: Я был подвержен значительному количеству 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 'Нельзя делить на ноль'
Явные именованные исключения — это значительно лучший способ справиться с нелинейной условной ветвлением.
Ваш код использует бесконечный цикл для получения ответа пользователя на вопрос, нравится ли ему пирог. Вот его перевод на русский в стиле ответа на StackOverflow:
answer = None
while True:
answer = input("Вам нравится пирог? ") # Используйте input() вместо raw_input() в Python 3
if answer in ("да", "нет"):
break
print("Это не да и не нет.")
Этот код эффективно запрашивает у пользователя ответ и продолжает спрашивать, пока не будет введено либо "да", либо "нет". Он не использует оператор goto
, что делает его простым и понятным.
Как изменить порядок столбцов в DataFrame?
'pip' не распознан как командa внутреннего или внешнего формата
Почему statistics.mean() работает так медленно?
Преобразование строки даты JSON в datetime в Python
Есть ли разница между поднятием экземпляра класса Exception и самого класса Exception?