O equivalente a um GOTO em python [duplicate]
- Há alguma etiqueta/goto em Python? 15 respostas
6 answers
Goto
s 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çãogoto
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)
.
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)
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]}.
goto
.
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.
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.