Het equivalent van een GOTO in python

Ik ben mezelf aan het leren python 2.7. Ik heb enige ervaring met het gebruik van BATCH, die een GOTO-statement heeft. Hoe doe ik dat in Python? Stel dat ik bijvoorbeeld van regel 5 naar regel 18 wil springen.

Ik realiseer me dat er eerdere vragen over dit onderwerp zijn geweest, maar ik vond ze niet voldoende informatief of ze zijn te hoog in python voor mijn huidige begrip.


Antwoord 1, autoriteit 100%

goto‘s worden in de informatica en programmering algemeen verguisd omdat ze tot zeer ongestructureerde code leiden.

Python ondersteunt (zoals bijna elke programmeertaal tegenwoordig) gestructureerd programmerendat de stroom regelt met behulp van if/then/else, loop en subroutines.

De sleutel tot gestructureerd denken is om te begrijpen hoe en waarom je vertakt op code.

Laten we bijvoorbeeld doen alsof Python een gotoen bijbehorende label-instructie huilenhad. Kijk naar de volgende code. Daarin als een getal groter is dan of gelijk is aan 0, printen we als het

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"

Als we willen weten wanneer een stukje code wordt uitgevoerd, moeten we het programma zorgvuldig traceren en onderzoeken hoe aan een label is gekomen – iets wat niet echt kan.

We kunnen het bovenstaande bijvoorbeeld herschrijven als:

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"

Hier zijn er twee mogelijke manieren om aan te komen aan het “einde”, en we kunnen niet weten welke is gekozen. Zoals programma’s groot worden, wordt dit soort probleem slechter en resulteert in spaghetti-code

In vergelijking, hieronder is hoe u Dit programma in Python zou schrijven:

number = input()
if number >= 0:
   if number % 2 == 0:
       print "even"
   else:
       print "odd"
else:
   print "negative"
print "all done"

Ik kan naar een bepaalde regel van code kijken en weet onder welke voorwaarden waaraan het is voldaan door de boom van if/then/elseblokken te traceren. Bijvoorbeeld, ik weet dat bijvoorbeeld dat De lijn print "odd"wordt uitgevoerd wanneer een ((number >= 0) == True) and ((number % 2 == 0) == False).


Antwoord 2, Autoriteit 105%

vergeef me – ik kon niet weerstaan; -)

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)

Antwoord 3, Autoriteit 59%

Ik ben het er helemaal mee eens dat gotoslecht is, slechte codering, maar niemand heeft de vraag daadwerkelijk beantwoord. Er isin feite een goto-module voor Python(hoewel deze in april werd uitgebracht dwaze grap en wordt niet aanbevolen om te gebruiken, het werktwerkt).


Antwoord 4, autoriteit 14%

Er is geen gotoinstructie in de programmeertaal Python. Je moet je code op een gestructureerdemanier schrijven… wil je een gotogebruiken? dat wordt al tientallen jaren als schadelijk beschouwden elk programma dat je maar kunt bedenken van kan worden geschreven zonder gotote gebruiken.

Natuurlijk zijn er enkele gevallenwaarbij een onvoorwaardelijke sprong kan nuttigzijn, maar het is nooit verplicht, er zal altijd een semantisch equivalente, gestructureerde oplossing bestaan die gotoniet nodig heeft.


Antwoord 5, autoriteit 9%

Disclaimer: ik ben blootgesteld aan een aanzienlijke hoeveelheid F77

Het moderne equivalent van goto(betwistbaar, alleen mijn mening, enz.) is expliciete afhandeling van uitzonderingen:

Bewerkt om hergebruik van de code beter te benadrukken.

Doe alsof pseudocode in een valse python-achtige taal met 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'.

In vergelijking met 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'

Uitdrukkelijke genoemde uitzonderingen zijn een aanzienlijk betere manier om te gaan met niet-lineaire afhankelijke vertakking.


Antwoord 6, Autoriteit 6%

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"

zou u geven wat u wilt zonder GOTO-verklaring.

Other episodes