El equivalente de un GOTO en python

Soy autodidacta python 2.7. Tengo algo de experiencia en el uso de BATCH, que tiene una statement GOTO. ¿Cómo hago eso en python? Por ejemplo, supongamos que quiero saltar de la línea 5 a la línea 18.

Me doy cuenta de que ha habido preguntas anteriores con respecto a este tema, pero no las he encontrado lo suficientemente informativas o, están demasiado alto nivel en python para mi comprensión actual.

Goto s son universalmente revisados ​​en informática y progtwigción, ya que conducen a un código muy desestructurado.

Python (como casi todos los lenguajes de progtwigción actuales) admite la progtwigción estructurada que controla el flujo utilizando if / then / else, loop y subrutinas.

La clave para pensar de manera estructurada es entender cómo y por qué se está ramificando en el código.

Por ejemplo, supongamos que Python tuvo un goto y el correspondiente goto label . Mira el siguiente código. En ella, si un número es mayor o igual a 0, imprimimos si

 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" 

Si queremos saber cuándo se ejecuta un fragmento de código, debemos rastrear cuidadosamente el progtwig y examinar cómo se llegó a una etiqueta, que es algo que realmente no se puede hacer.

Por ejemplo, podemos reescribir lo anterior 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" 

Aquí, hay dos formas posibles de llegar al "final", y no podemos saber cuál fue elegido. A medida que los progtwigs crecen, este tipo de problema empeora y da como resultado un código de espagueti.

En comparación, a continuación se muestra cómo escribiría este progtwig en Python:

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

Puedo ver una línea de código en particular, y saber en qué condiciones se cumple al rastrear el árbol de if/then/else bloquea. Por ejemplo, sé que la línea de print "odd" se ejecutará cuando a ((number >= 0) == True) and ((number % 2 == 0) == False) .

Perdóname, no pude resistirme 😉

 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) 

Estoy totalmente de acuerdo en que goto es una encoding pobre, pero nadie ha respondido la pregunta. De hecho, hay un módulo goto para Python (aunque fue publicado como una broma tonta de abril y no se recomienda su uso, funciona).

No hay instrucciones de goto en el lenguaje de progtwigción Python. Tendrá que escribir su código de una manera estructurada … Pero en realidad, ¿por qué quiere usar un goto ? eso se ha considerado perjudicial durante décadas, y cualquier progtwig que pueda imaginar puede escribirse sin usar goto .

Por supuesto, hay algunos casos en los que un salto incondicional puede ser útil , pero nunca es obligatorio , siempre existirá una solución semánticamente equivalente y estructurada que no necesita goto .

Descargo de responsabilidad: He estado expuesto a una cantidad significativa de F77

El equivalente moderno de goto (discutible, solo mi opinión, etc.) es el manejo explícito de excepciones:

Editado para resaltar mejor la reutilización del código.

Finge el pseudocódigo en un lenguaje falso parecido a un python con 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 con 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' 

Las excepciones explícitas nombradas son una manera significativamente mejor de lidiar con la bifurcación condicional no lineal.

 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" 

Te daría lo que quieres sin goto.