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.

31
demandé sur csgillespie 2013-09-18 07:21:11

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

46
répondu 2013-09-18 06:36:28

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)
43
répondu Tim Peters 2013-09-18 03:45:38

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

31
répondu scohe001 2015-07-20 17:50:02

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 .

7
répondu Óscar López 2017-05-23 11:54:53

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.

6
répondu Caleb Hattingh 2013-09-18 03:57:55
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.

3
répondu Paul Becotte 2013-09-18 04:30:03