我自学了python 2.7。我有使用BATCH的经验,它有一个GOTO语句。我怎么在python中做到这一点?例如,假设我想从第5行跳到第18行。
我意识到之前有关于这个主题的问题,但是我没有发现它们的信息量足够大,或者在我目前的理解中对python来说太高级了。
答案 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声明会给你你想要的东西。