これを行うためのより良い方法が必要です。私はプログラミングに不慣れですが、これは非常に非効率的な方法であり、そのための関数が必要であることを知っています。正確に行う方法がわかりません。助言がありますか?私はどんな助けにもとても感謝しています!
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)
3つ以上の番号が付けられ、同様に使用される変数がある場合は、リストを考えてください。
そのことを念頭に置いて、最初にlist1、list2、list3、...をリストのリストに変更します(1、2、3、4ではなく0、1、2、3のインデックスが付けられます)。それを呼ばないことを除いてlist
、それはすでに有用な何かの有用な名前だからです。lst
Pythonではかなり人気があります。また、5と6が意味をなさなくなったため、list5をlstAに、list6をlstBに変更します。
今、私たちはこれを持っています:
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)
これで、基本的に同じことを4回行っていることがより明白になりました。
同じことを何度もしなければならないときは、ループを考えてください。
ブロックをループに変更します。また、フラグ変数を使用して、ロジックのテスト中に何かが失敗したかどうかを追跡し、「機能する場合は実行する」ではなく、「機能しない場合はスキップする」というロジックを使用します。
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)
一度に複数のループから抜け出す必要がある場合は、関数を考えて、壊すのではなく戻るようにします。または例外とtryブロックですが、一部の人はそれを不快に感じるかもしれません。
失敗フラグは機能しますが、あまりエレガントではありません。誇張されたことわざがあります:「... 3レベル以上のインデントが必要な場合は、とにかく失敗しているので、プログラムを修正する必要があります。」これを次のように読んでください。インデントのレベルが多い場合(および一部の言語では他の言語よりも多くのレベルが必要な場合)、ロジックの一部を関数に移動できるかどうかを検討する必要があります。
また、繰り返されるロジックをチェッカー関数に移動します。
(最後に、2番目のforループが最初のforループにネストされているのはバグだと思います。同じイテレーター変数Hがあるため、無限ループが発生すると思います。それで修正しました。)
#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)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加