Подтвердить что ты не робот

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

Я сам учу себя python 2.7. У меня есть некоторый опыт использования BATCH, который имеет инструкцию GOTO. Как это сделать в python? Например, предположим, что я хочу перейти от строки 5 к строке 18.

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

4b9b3361

Ответ 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.