while usar pass gotoxy else como python goto

usar - El equivalente de un GOTO en python



if pass python (6)

Estoy totalmente de acuerdo en que goto es una codificación 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).

Esta pregunta ya tiene una respuesta aquí:

Soy autodidacta python 2.7. Tengo algo de experiencia en el uso de BATCH, que tiene una declaración 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.


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

Por supuesto, hay algunos cases 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 .


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)


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

Python (como casi todos los lenguajes de programación hoy en día) admite la programació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 ramifica 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 programa 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 programas crecen, este tipo de problema empeora y se traduce en un código de espagueti.

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

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

Puedo mirar 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) .


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 pitón 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 tratar 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.