<p>当你有三个或更多的数字和类似的使用变量,思考列表。</p>
<p>考虑到这一点,我们首先更改list1,list2,list3。。。进入列表列表(索引为0,1,2,3而不是1,2,3,4)。但不要叫它<code>list</code>,因为这是一个对已经有用的东西有用的名字。<code>lst</code>在Python中非常流行。我还要把list5改成lstA,list6改成lstB,因为5和6不再有意义了。</p>
<p>现在我们有了这个:</p>
<pre><code>for H in range(0,len(a_list)):
if a_list[H] > lst[3][0]:
lstA = [number_list[i]]
if function(lst[0],lstA) == lst[0][1]:
if function(lst[1],lstA)== lst[1][1]:
if function(lst[2],lstA)== lst[2][1]:
if function(lst[3],lstA)== lst[3][1]:
lstA.append(input('some input from the user'))
other_function(lstA)
if lstA[1]== 40:
print ('something something')
break out of EVERY loop
else:
for H in range(0,len(a_list)):
if a_list[H] > lstA[0]:
lstB = [number_list[i]]
if function(lst[0],lstB) == lst[0][1]:
if function(lst[1],lstB)== lst[1][1]:
if function(lst[2],lstB)== lst[2][1]:
if function(lst[3],lstB)== lst[3][1]:
if function(lstA,lstB)== lstA[1]:
lstB.append(input('some input from theuser'))
other_function(lstB)
if lstB[1]== 40:
print ('something something')
break out of EVERY loop
else:
etc. (one extra comparison every time)
</code></pre>
<p>现在更明显的是,我们基本上做了四次同样的事情。</p>
<hr/>
<p>当你不得不做同样的事情很多次,想循环。</p>
<p>我们将把这些块换成圈。我们还将使用一个标志变量来跟踪在测试我们的逻辑时是否失败,并使用逻辑“如果它不起作用,就跳过一些事情”而不是“如果它起作用,就做一些事情”</p>
<pre><code>for H in range(0,len(a_list)):
if a_list[H] > lst[3][0]:
continue #reducing indent levels by negating the check:
#quit on failure instead of work on success
lstA = [number_list[i]]
quit = False
for j in range(4):
if function(lst[j],lstA) != lst[j][1]: #testing FALSEHOOD
quit = True
break #the j loop only
if quit:
continue #reducing indent levels by negating the check
lstA.append(input('some input from the user'))
other_function(lstA)
if lstA[1]== 40:
print ('something something')
break #out of EVERY loop
#else: #don't need the else because we broke
for H in range(0,len(a_list)):
if not a_list[H] > lstA[0]:
continue #reducing indent levels by negating the check
lstB = [number_list[i]]
for j in range(4):
if function(lst[j],lstB) != lst[j][1]: #testing FALSEHOOD
quit = True;
break #to the H loop
if not quit and function(lstA,lstB)== lstA[1]: #combining two checks
lstB.append(input('some input from theuser'))
other_function(lstB)
if lstB[1]== 40:
print ('something something')
break #out of EVERY loop
else: #at this point I'm lost and can't refactor
etc. (one extra comparison every time)
</code></pre>
<hr/>
<p>当您必须同时中断多个循环时,请考虑函数并返回而不是中断。或者是例外情况,试一下积木,但有些人可能会觉得不舒服。</p>
<p>失败的旗帜有效,但不是很优雅。有句夸张的话:<a href="https://stackoverflow.com/questions/10959683/preferred-maximum-indentation-in-python">"... if you need more than 3 levels of indentation, you're screwed anyway, and should fix your program."</a>把它读成:如果你有很多级别的缩进(有些语言比其他语言需要更多),你应该考虑是否可以将一些逻辑移到一个函数中。</p>
<p>我们还将把一些重复的逻辑移到checker函数中。</p>
<p>(最后,我认为第二个for循环嵌套在第一个for循环中是一个bug。因为它们有相同的迭代器变量H,我想这会导致无限循环。所以我修好了。)</p>
<pre><code>#returns FALSE if a check fails, unlike the `quit` variable
def checker(lst, lstA):
for i in range(4):
if function(lst[i],lstA) != lst[i][1]: #testing FALSEHOOD
return False;
return True;
def main(???):
for H in range(0,len(a_list)):
if a_list[H] > lst[3][0]:
continue
lstA = [number_list[i]]
if not checker(lst,lstA):
continue
lstA.append(input('some input from the user'))
other_function(lstA)
if lstA[1]== 40:
print ('something something')
return #break out of EVERY loop
for H in range(0,len(a_list)):
if not a_list[H] > lstA[0]:
continue
lstB = [number_list[i]]
if checker(lst,lstB) and function(lstA,lstB) == lstA[1]:
lstB.append(input('some input from theuser'))
other_function(lstB)
if lstB[1]== 40:
print ('something something')
return # break out of EVERY loop
else: #at this point I'm lost and can't refactor
etc. (one extra comparison every time)
</code></pre>