web-dev-qa-db-fra.com

L'équivalent d'un GOTO dans python

Je m'auto-enseigne moi-même python 2.7. J'ai quelques expériences dans l'utilisation de BATCH, qui a une déclaration GOTO. Comment puis-je faire cela en python? Par exemple, supposons que je souhaite passer de la ligne 5 à la ligne 18.

Je me rends compte qu'il y a déjà eu des questions sur ce sujet, mais je ne les ai pas trouvées suffisamment informatives ou, elles sont de trop haut niveau dans python pour ma compréhension actuelle.

40
Calder Hutchins

Les Gotosont universellement critiqués en informatique et en programmation car ils conduisent à un code très non structuré.

Python (comme presque tous les langages de programmation actuels) supporte programmation structurée qui contrôle le flux en utilisant if/then/else, une boucle et des sous-routines.

Pour structurer votre réflexion de manière structurée, vous devez comprendre comment et pourquoi vous modifiez le code.

Par exemple, supposons que Python ait une instruction goto et la déclaration label correspondante frissonnante . Regardez le code suivant. Si un nombre est supérieur ou égal à 0, nous l’imprimons 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 nous voulons savoir quand un morceau de code est exécuté, nous devons soigneusement retracer le programme et examiner comment une étiquette a été obtenue - ce qui est quelque chose qui ne peut pas vraiment être fait.

Par exemple, nous pouvons réécrire ce qui précède comme suit:

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 manières possibles d'arriver à la "fin", et on ne peut pas savoir laquelle a été choisie. Au fur et à mesure que les programmes prennent de l'ampleur, ce genre de problème s'aggrave et aboutit à code spaghetti

En comparaison, voici comment vous écririez 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 dans quelles conditions elle est remplie en retraçant l'arbre de blocs if/then/else dans lequel il se trouve. Par exemple, je sais que la ligne print "odd" sera exécutée. quand un ((number >= 0) == True) and ((number % 2 == 0) == False).

56
user764357

Pardonnez-moi - je n'ai pas pu 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)
54
Tim Peters

Je suis tout à fait d’accord pour dire que goto est mauvais, mais personne n’a répondu à la question. Là est en fait un module goto pour Python (bien qu'il ait été publié comme une blague du poisson d'avril et qu'il n'est pas recommandé de le faire utilisé, il fonctionne ).

35
scohe001

Il n'y a pas d'instruction goto dans le langage de programmation Python. Vous devrez écrire votre code de manière structurée ... Mais vraiment, pourquoi voulez-vous utiliser un goto? cela fait considéré comme nuisible depuis 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 ce n'est jamais obligatoire , il existera toujours une solution structurée et sémantiquement équivalente ne nécessitant pas de goto.

9
Óscar López

Avertissement: j'ai été exposé à une quantité importante de F77

L'équivalent moderne de goto (discutable, seul mon avis, etc.) est le traitement explicite des exceptions:

Edité pour mettre en évidence le code réutiliser mieux.

Imaginez un pseudocode dans un faux langage ressemblant à un 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'.

Par rapport au 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 nommées explicites constituent un considérablement meilleur moyen de traiter les branchements conditionnels non linéaires.

6
Caleb Hattingh
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 goto.

4
Paul Becotte