相当于python中的GOTO

时间:2013-09-18 03:21:11

标签: python goto

我自学了python 2.7。我有使用BATCH的经验,它有一个GOTO语句。我怎么在python中做到这一点?例如,假设我想从第5行跳到第18行。

我意识到之前有关于这个主题的问题,但是我没有发现它们的信息量足够大,或者在我目前的理解中对python来说太高级了。

6 个答案:

答案 0 :(得分:55)

Goto在计算机科学和编程方面普遍受到谴责,因为它们会导致非结构化的代码。

Python(几乎与今天的每种编程语言一样)支持structured programming,它使用if / then / else,循环和子程序来控制流程。

以结构化方式思考的关键是要了解如何以及为什么要分支代码。

例如,假设Python有一个goto和相应的label语句 shudder 。请查看以下代码。如果数字大于或等于0,我们将打印

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"

如果我们想知道何时执行一段代码,我们需要在程序中仔细追溯,并检查标签是如何到达的 - 这是无法真正完成的。

例如,我们可以将上述内容重写为:

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"

在这里,有两种可能的方式来达到“结束”,我们无法知道选择了哪一种。随着程序变大,这种问题变得更糟,导致spaghetti code

相比之下,下面是 在Python中编写此程序的方式:

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

我可以查看特定的代码行,并通过追溯它所在的if/then/else块树来了解它在什么条件下满足。例如,我知道行print "odd"将在((number >= 0) == True) and ((number % 2 == 0) == False)

时运行

答案 1 :(得分:50)

原谅我 - 我无法抗拒; - )

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)

答案 2 :(得分:33)

我完全同意goto编码很差,但实际上没有人回答这个问题。 实际上是goto module for Python(虽然它是作为四月愚蠢的笑话发布的,不推荐使用, 工作)。

答案 3 :(得分:9)

Python编程语言中没有goto指令。您必须以structured方式编写代码......但实际上,您为什么要使用goto?几十年来一直是considered harmful,你能想到的任何程序都可以在不使用goto的情况下编写。

当然,有些cases无条件跳转可能有用,但它永远不会强制,总会存在语义等效的,结构化的解决方案不需要goto

答案 4 :(得分:6)

免责声明:我接触过大量的F77

goto的现代等价物(可论证,只有我的观点等)是明确的异常处理:

编辑以更好地突出代码重用。

使用goto伪装成类似python的语言中的伪代码:

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

与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'

显式命名异常是处理非线性条件分支的显着更好的方法。

答案 5 :(得分:4)

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"

没有goto声明会给你你想要的东西。