Эквивалент GOTO в python
Я сам учу себя python 2.7. У меня есть некоторый опыт использования BATCH, который имеет инструкцию GOTO. Как это сделать в python? Например, предположим, что я хочу перейти от строки 5 к строке 18.
Я понимаю, что были предыдущие вопросы по этой теме, но я не нашел их достаточно информативными или слишком высокого уровня в python для моего нынешнего понимания.
Ответы
Ответ 1
Goto
повсеместно оскорблены в области информатики и программирования, поскольку они приводят к очень неструктурированному коду.
Python (как и почти каждый язык программирования сегодня) поддерживает структурированное программирование, которое управляет потоком, используя if/then/else, loop и подпрограммы.
Ключ к мышлению структурированным способом заключается в том, чтобы понять, как и почему вы разветвляетесь по коду.
Например, допустим, что у Python был Goto
и соответствующий трясет оператора label
. Посмотрите на следующий код. В нем, если число больше или равно 0, мы печатаем, если оно
number = input()
if number < 0: goto negative
if number % 2 == 0:
print "even"
else:
print "odd"
goto end
label: negative
print "negative"
label: end
print "all done"
Если мы хотим знать, когда выполняется кусок кода, нам нужно тщательно отслеживать программу и изучать, как был получен ярлык - что-то, что действительно невозможно сделать.
Например, мы можем переписать вышеприведенное как:
number = input()
goto check
label: negative
print "negative"
goto end
label: check
if number < 0: goto negative
if number % 2 == 0:
print "even"
else:
print "odd"
goto end
label: end
print "all done"
Здесь есть два возможных способа достижения "конца", и мы не можем знать, какой из них был выбран. По мере того, как программы становятся большими, эта проблема ухудшается и приводит к коду спагетти
Для сравнения ниже вы можете написать эту программу в Python:
number = input()
if number >= 0:
if number % 2 == 0:
print "even"
else:
print "odd"
else:
print "negative"
print "all done"
Я могу посмотреть конкретную строку кода и узнать, в каких условиях это выполняется, отслеживая дерево if/then/else
, в котором он находится. Например, я знаю, что строка print "odd"
будет запущена, когда a ((number >= 0) == True) and ((number % 2 == 0) == False)
.
Ответ 2
Прости меня - я не мог устоять; -)
def goto(linenum):
global line
line = linenum
line = 1
while True:
if line == 1:
response = raw_input("yes or no? ")
if response == "yes":
goto(2)
elif response == "no":
goto(3)
else:
goto(100)
elif line == 2:
print "Thank you for the yes!"
goto(20)
elif line == 3:
print "Thank you for the no!"
goto(20)
elif line == 20:
break
elif line == 100:
print "You're annoying me - answer the question!"
goto(1)
Ответ 3
Я полностью согласен с тем, что goto
плохое кодирование, но никто не ответил на этот вопрос. Там есть модуль goto для Python (хотя он был выпущен в качестве шутки в апреле и не рекомендуется использовать, он действительно работает).
Ответ 4
Нет инструкции goto
на языке программирования Python. Вам нужно будет написать свой код в structured способом... Но действительно, почему вы хотите использовать goto
? что считается вредным в течение десятилетий, и любая программа, о которой вы можете думать, может быть написана без использования goto
.
Конечно, есть некоторые случаи, где безусловный переход может быть полезен, но он никогда не является обязательным, всегда будет существовать семантически эквивалентное, структурированное решение, t требуется goto
.
Ответ 5
Отказ от ответственности: я подвергся воздействию значительного количества F77
Современный эквивалент goto
(возможно, только мое мнение и т.д.) - это явная обработка исключений:
Отредактировано для лучшего повторного использования кода.
Представьте псевдокод на фальшивом питонном языке с 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 'Cannot divide by zero'.
По сравнению с python:
def myfunc1(x):
return 1/x
def myfunc2(y):
return 1/y
try:
myfunc1(0)
myfunc2(0)
except ZeroDivisionError:
print 'Cannot divide by zero'
Явные именованные исключения - это значительно лучший способ борьбы с нелинейным условным ветвлением.
Ответ 6
answer = None
while True:
answer = raw_input("Do you like pie?")
if answer in ("yes", "no"): break
print "That is not a yes or a no"
Дал бы вам то, что вы хотите, без инструкции goto.