L'équivalent D'un GOTO en python [dupliquer]
cette question a déjà une réponse ici:
Je m'autodidacte en python 2.7. J'ai une certaine expérience dans L'utilisation de BATCH, qui a une déclaration GOTO. Comment je fais ça en python? Par exemple, supposons que je veuille sauter de ligne 5 à ligne 18.
je me rends compte qu'il y a eu des questions précédentes sur ce sujet, mais je ne les ai pas trouvées suffisamment informatives ou, sont de trop haut niveau en python pour ma compréhension actuelle.
6 réponses
Goto
s sont universellement injuriés dans l'informatique et la programmation car ils conduisent à code très non structuré.
Python (comme presque tous les langages de programmation aujourd'hui) supporte programmation structurée qui contrôle le flux en utilisant if/then/else, loop et sous-programmes.
la clé pour penser de manière structurée est de comprendre comment et pourquoi vous branchez sur le code.
par exemple, prétendons que Python avait un goto
et correspondant label
déclaration frémissement . Regardez le code suivant. Si un nombre est supérieur ou égal à 0 on a l'impression, si elle
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 nous voulons savoir quand un morceau de code est exécuté, nous devons soigneusement retracer dans le programme, et examiner comment un label a été atteint - ce qui est quelque chose qui ne peut pas vraiment être fait.
Par exemple, nous pouvons réécrire ci-dessus:
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"
ici, il y a deux façons possibles d'arriver à la "fin", et nous ne pouvons pas savoir laquelle a été choisie. Comme les programmes deviennent grands ce genre de problème s'aggrave et les résultats dans code spaghetti
en comparaison, ci-dessous est la façon dont vous serait écrire ce programme en Python:
number = input()
if number >= 0:
if number % 2 == 0:
print "even"
else:
print "odd"
else:
print "negative"
print "all done"
je peux regarder une ligne de code particulière, et savoir Sous quoi conditions, il est rencontré par de remonter l'arbre de la if/then/else
blocs. Par exemple, je sais que la ligne print "odd"
lors d'un ((number >= 0) == True) and ((number % 2 == 0) == False)
.
Pardonnez-moi - je ne pouvais pas résister ;-)
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)
je suis entièrement d'accord que goto
est un mauvais codage, mais personne n'a réellement répondu à la question. Il est en fait un module goto pour Python (bien qu'il ait été publié comme une blague de poisson d'avril et n'est pas recommandé d'être utilisé, il fait travail).
il n'y a pas d'instruction goto
dans le langage de programmation Python. Vous devrez écrire votre code d'une manière structurée ... Mais vraiment, pourquoi voulez-vous utiliser un goto
? cela a été considéré comme nocif pendant des décennies, et tout programme auquel vous pouvez penser peut être écrit sans utiliser goto
.
bien sûr, il y a quelques cas où un saut inconditionnel pourrait être utile , mais il n'est jamais obligatoire , il existera toujours une solution sémantiquement équivalente, structurée qui n'a pas besoin goto
.
Avertissement: j'ai été exposé à une quantité importante de F77
l'équivalent moderne de goto
(discutable, seulement mon opinion, etc) est le traitement d'exception explicite:
édité pour mieux mettre en évidence la réutilisation du code.
pseudo pseudocode dans un faux langage de type python avec 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'.
comparé à 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'
les exceptions explicites nommées sont une de façon significative meilleure façon de traiter la ramification conditionnelle non linéaire.
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"
vous donnerait ce que vous voulez sans DÉCLARATION DE goto.