Python—有没有办法避免for循环中的几个if语句互相插入?
我需要一个更好的方法。我是编程新手,但我知道这是一种非常低效的方法,我需要一个函数来实现它,我只是不知道如何准确地实现它。有什么建议吗?我非常感谢你的帮助Python—有没有办法避免for循环中的几个if语句互相插入?,python,for-loop,comparison,iteration,list-comparison,Python,For Loop,Comparison,Iteration,List Comparison,我需要一个更好的方法。我是编程新手,但我知道这是一种非常低效的方法,我需要一个函数来实现它,我只是不知道如何准确地实现它。有什么建议吗?我非常感谢你的帮助 for H in range(0,len(a_list)): if a_list[H] > list4[0]: list5 = [number_list[i]] if function(list1,list5) == list1[1]: if function(list2,
for H in range(0,len(a_list)):
if a_list[H] > list4[0]:
list5 = [number_list[i]]
if function(list1,list5) == list1[1]:
if function(list2,list5)== list2[1]:
if function(list3,list5)== list3[1]:
if function(list4,list5)== list4[1]:
list5.append(input('some input from the user'))
other_function(list5)
if list5[1]== 40:
print ('something something')
break out of EVERY loop
else:
for H in range(0,len(a_list)):
if a_list[H] > list5[0]:
list6 = [number_list[i]]
if function(list1,list6) == list1[1]:
if function(list2,list6)== list2[1]:
if function(list3,list6)== list3[1]:
if function(list4,list6)== list4[1]:
if function(list5,list6)== list5[1]:
list6.append(input('some input from theuser'))
other_function(list6)
if list6[1]== 40:
print ('something something')
break out of EVERY loop
else:
etc. (one extra comparison every time)
使用可测试多个相关条件:
if all(function(lst, list5) == lst[1] for lst in (list1, list2, list3, list4)):
及
与嵌套的if
语句一样,all()
将短路;一旦任何测试失败,立即返回False
此外,直接循环列表,而不是生成一系列索引。如果使用的是break
,则也不需要使用else
,从而删除另一级缩进
您可以通过过滤列表来删除另一个级别:
for H in filter(lambda H: H > list4[0], a_list):
总之,这会将嵌套减少到:
for H in filter(lambda H: H > list4[0], a_list):
list5 = [number_list[i]]
if all(function(lst, list5) == lst[1] for lst in (list1, list2, list3, list4)):
list5.append(input('some input from the user'))
other_function(list5)
if list5[1]== 40:
print ('something something')
break # out of EVERY loop
for J in filter(lambda J: J >list5[0], a_list):
if all(function(lst, list6) == lst[1] for lst in (list1, list2, list3, list4, list5)):
list6.append(input('some input from theuser'))
other_function(list6)
if list6[1]== 40:
print ('something something')
break # out of EVERY loop
# continue here
假设您的break
语句实际使用异常(raise CustomException()
和try:
,除外CustomException:#快速中断所有循环
),因为常规的break
只会停止当前循环
如果您不断添加更多列表和嵌套,您可能希望使用一个列表来保存所有这些嵌套列表,然后只需添加到外部列表:
class EndLoops(Exception): pass
stack = [[number_list[0]]]
try:
for i in number_list[1:]:
for H in filter(lambda H: H > stack[-1][0], a_list):
stack.append([i])
if all(function(lst, stack[-1]) == lst[1] for lst in stack[:-1]):
stack[-1].append(input('some input from the user'))
other_function(stack[-1])
if stack[-1][1] == 40:
print ('something something')
raise EndLoops
except EndLoops:
pass # broken out of outer loop
突然间,所有的巢穴都消失了;而是将嵌套移动到列表的堆栈中
请注意,我不知道代码中最外层的循环是什么样子的,我只是在黑暗中进行了一次有根据的尝试,但这个想法应该大致正确。当您有三个或更多编号且使用类似的变量时,请考虑列表
考虑到这一点,我们首先更改列表1、列表2、列表3。。。进入列表列表(索引为0,1,2,3,而不是1,2,3,4)。除了不要叫它列表
,因为这是一个有用的名字,它已经很有用了lst
在Python中非常流行。我还将把list5改为lstA,把list6改为lstB,因为5和6不再有意义
现在我们有了这个:
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)
现在更明显的是,我们基本上做了四次同样的事情
当你不得不多次做同样的事情时,想想循环
我们将把这些块变成循环。我们还将使用一个标志变量来跟踪在测试逻辑时是否出现故障,并使用逻辑“如果它不起作用,跳过内容”而不是“如果它起作用,做一些事情”
当您必须同时中断多个循环时,请考虑函数和返回,而不是中断。或者异常,并尝试块,但有些人可能会觉得不舒服
失败标志有效,但不是很优雅。有一种夸张的说法:将此理解为:如果您有很多缩进级别(某些语言比其他语言要求更多),您应该考虑是否可以将一些逻辑移到函数中
我们还将把一些重复的逻辑移到checker函数中
(最后,我认为第二个for循环嵌套在第一个for循环中是一个错误。因为它们具有相同的迭代器变量H,我认为这将导致无限循环。因此我修复了这个问题。)
如果X==Y和Z==W并且代码>以完全相同的顺序?这真的是您的代码,还是只是为了显示大量嵌套代码而编造的?代码应该完成什么?它正在查找数据吗?它正在进行计算吗?根据这些问题的答案,真正的答案可能是更改您的数据结构,以避免所有条件检查。可能有一种完全不同且更好的方法来执行您尝试执行的操作…您是否可以添加对预期功能(输入/输出)的描述?请注意,拥有6个名为list1
,list2
,…,list6
的变量几乎总是设计错误的标志,因为您无法轻松地对它们进行迭代,即使从代码中可以清楚地看出它们是类似类型的对象。列表或字典可能是更好的选择。是的,这就是代码。不幸的是。。它必须将函数(list,list)的结果与每个列表的索引1中的值进行比较。非常感谢,我会看看是否可以让它使用这个函数!非常感谢。我能通过你的建议解决我的问题!说真的,我现在可以吻你了。。。我要感谢你,因为你很有教育意义,这让我这个几乎不懂编程的人变得容易多了!如果我想在检查程序每次迭代都返回false时打印一些内容,那么我该怎么做呢?:)使用else
。或者嵌套,如果是第二次。但是如果我只使用一个for循环?我不知道你在问什么
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)
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)
#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)