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í:
- ¿Hay una etiqueta / goto en Python? 15 respuestas
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.