<p>我们来看看代码的执行情况。你知道吗</p>
<pre><code>def getMax4(list):
highest = 0
if len(list) == 0:
return -999
else:
for number in list:
if number % 4 == 0:
if number < highest:
highest = number
else:
highest = 0
return number
</code></pre>
<p>最明显的情况是长度为零的列表,它可以正确地处理它们。呜呼。你知道吗</p>
<p>另一个明显的例子是一个数字可以被4整除的列表。让我们看看:</p>
<pre><code># imagine getMax4([[1, 16, 20, 12])
# note that this is different from your example, because your example doesn't
# highlight a meaningful bug!
# unroll the for loop:
number = 1
if number % 4 == 0: # it doesn't, so skip
number = 16
if number % 4 == 0:
if number < highest: # it's not, but this should pass. Your comparison is backwards here!
else:
highest = 0 # what?? we reset it?? Why??!
return number
</code></pre>
<p>所以我们已经确定了几个问题,包括一旦我们找到一个可以被4整除的数,我们就返回这个数作为解,尽管这里的正确答案是20。这显然是错误的!你知道吗</p>
<p>让我们介入并解决这些问题。你知道吗</p>
<pre><code>def getMax4(list):
highest = 0
if len(list) == 0:
return -999
else:
for number in list:
if number % 4 == 0:
if number > highest: # flip comparison
highest = number
# removed the else clause
return highest # pulled this all the way out past the for loop's end
</code></pre>
<p>现在,让我们用新代码完成同一个调用</p>
<pre><code># getMax4([[1, 16, 20, 12])
# unroll the for loop
number = 1
if 1 % 4 == 0: # it's not
number = 16
if 16 % 4 == 0: # it is!
if 16 > 0: # it is!
highest = 16 # remember it
number = 20
if 20 % 4 == 0: # bingo!
if 20 > 16: # yup-a-roonie
highest = 20 # remember this one now. We can forget 16
number = 12
if 12 % 4 == 0: # batting 1.000
if 12 > 20: # not this time, buck-o.
# now we're all done with the for loop, so we step outside and find
return number # which is 20
</code></pre>
<hr/>
<p>现在我们可以看一下清理一下:</p>
<pre><code>def getMax4(list):
highest = 0
if len(list) == 0:
return -999
# whenever you have an early-exit conditional, there's no reason to
# write the rest in an `else`. Just omit the `else` and dedent.
for number in list:
if number % 4 == 0:
if number > highest:
highest = number
return highest
</code></pre>