<p><code>Goto</code>s在计算机科学和编程中普遍受到抨击,因为它们导致非常非结构化的代码。</p>
<p>Python(和现在几乎所有的编程语言一样)支持<a href="http://en.wikipedia.org/wiki/Structured_programming">structured programming</a>,它使用if/then/else、循环和子例程控制流。</p>
<p>以结构化的方式思考的关键是理解如何以及为什么在代码上进行分支。</p>
<p>例如,让我们假设Python有一个<code>goto</code>和相应的<code>label</code>语句。请看下面的代码。如果一个数字大于或等于0,我们会打印</p>
<pre><code>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"
</code></pre>
<p>如果我们想知道一段代码何时被执行,我们需要仔细地在程序中进行回溯,并检查标签是如何到达的——这是不可能真正做到的。</p>
<p>例如,我们可以将上述内容重写为:</p>
<pre><code>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"
</code></pre>
<p>在这里,有两种可能的方法可以达到“结束”,我们不知道选择了哪一种。当程序变大时,这种问题会变得更糟,并导致<a href="http://en.wikipedia.org/wiki/Spaghetti_code">spaghetti code</a></p>
<p>相比之下,下面是您如何用Python编写这个程序:</p>
<pre><code>number = input()
if number >= 0:
if number % 2 == 0:
print "even"
else:
print "odd"
else:
print "negative"
print "all done"
</code></pre>
<p>我可以查看一行特定的代码,并通过追溯它所在的<code>if/then/else</code>块的树来知道在什么条件下满足它。例如,我知道<code>print "odd"</code>行将在<code>((number >= 0) == True) and ((number % 2 == 0) == False)</code>时运行。</p>