O equivalente a um GOTO em python [duplicate]

[[2] esta pergunta já tem uma resposta aqui:

  • Há alguma etiqueta/goto em Python? 15 respostas
Estou a auto-ensinar-me python 2.7. Tenho alguma experiência em usar BATCH, que tem uma declaração GOTO. Como faço isso em python? Por exemplo, suponha que eu queira saltar da linha 5 para a linha 18.

Eu sei que houve perguntas anteriores sobre este tópico, mas eu não as achei suficientemente informativas ou, são de nível muito alto em python para minha compreensão atual.

 31
Author: csgillespie, 2013-09-18

6 answers

Gotos são universalmente insultados em Ciência da computação e programação como eles levam a um código muito não estruturado.

O Python (como quase todas as linguagens de programação de hoje) suporta programação estruturada que controla o fluxo usando if/then/else, loop e sub-rotinas.

A chave para pensar de uma forma estruturada é entender como e porque você está ramificando em código.

Por exemplo, vamos fingir que o Python tinha uma declaração goto e correspondente label arrepio . Veja o seguinte código. Nele se um número é maior ou igual a 0 Nós imprimimos se ele
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"

Se queremos saber quando um pedaço de código é executado, precisamos rastrear cuidadosamente o programa, e examinar como um rótulo foi alcançado - o que é algo que realmente não pode ser feito.

Por exemplo, podemos reescrever o acima como:

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"
Aqui, há duas maneiras possíveis de chegar ao "fim", e não podemos saber qual foi escolhido. Como os programas ficam grandes este tipo de problema piora e resulta em código de esparguete

Em comparação, abaixo está como você iria escrever este programa em Python:

number = input()
if number >= 0:
   if number % 2 == 0:
       print "even"
   else:
       print "odd"
else:
   print "negative"
print "all done"

Posso olhar para uma linha de código em particular, e saber em que Condições ela é cumprida, rastreando a árvore de if/then/else blocos que está dentro. Por exemplo, eu sei que a linha print "odd" será executada quando um ((number >= 0) == True) and ((number % 2 == 0) == False).

 46
Author: , 2013-09-18 06:36:28
Perdoa - me, não consegui resistir.
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)
 43
Author: Tim Peters, 2013-09-18 03:45:38
{[[2]} eu concordo inteiramente que {[[[0]} é pobre codificação, mas ninguém realmente respondeu à pergunta. Há é de facto um módulo goto para Python (embora tenha sido lançado como uma piada de mentira de abril e não seja recomendado para ser usado, ele faz trabalho).
 31
Author: scohe001, 2015-07-20 17:50:02

Não há instrução goto na linguagem de programação Python. Terá de escrever o seu código de forma estruturada... Mas, a sério, porque queres usar um {[[0]}? isso tem sido considerado nocivo por décadas, e qualquer programa que você possa pensar pode ser escrito sem usar {[[0]}.

É claro que existem alguns casos em que um salto incondicional pode ser útil, mas nunca é obrigatório, sempre existirá um salto semanticamente. solução estruturada equivalente que não necessita de goto.
 7
Author: Óscar López, 2017-05-23 11:54:53

Declaração de exoneração de Responsabilidade: fui exposto a uma quantidade significativa de F77

O equivalente moderno de goto (discutível, apenas a minha opinião, etc.) é o tratamento explícito das excepções:

editado para realçar melhor a reutilização do Código.

Fingir um pseudocode numa linguagem de python falsa com 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'.

Comparado com 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'

As excepções explicitamente mencionadas são a significativamente a melhor maneira de lidar com condições não lineares ramificacao.

 6
Author: Caleb Hattingh, 2013-09-18 03:57:55
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"
Dar-te-ia o que quiseres sem declaração gótica.
 3
Author: Paul Becotte, 2013-09-18 04:30:03