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.
Les Goto
sont 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)
.
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)
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 ).
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
.
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.
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.