Python-forループ内で相互に複数のifステートメントを回避する方法はありますか?

user2966098

これを行うためのより良い方法が必要です。私はプログラミングに不慣れですが、これは非常に非効率的な方法であり、そのための関数が必要であることを知っています。正確に行う方法がわかりません。助言がありますか?私はどんな助けにもとても感謝しています!

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それはすでに有用な何かの有用な名前だからです。lstPythonではかなり人気があります。また、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]

編集
0

コメントを追加

0

関連記事

分類Dev

Pythonで複数行のwhileステートメント(10以上の条件)を作成するより良い方法はありますか?

分類Dev

PythonのIfステートメントで複数のfloat値を比較するより効率的な方法はありますか?

分類Dev

Python関数の各returnステートメントの前にステートメントを実行する方法はありますか?

分類Dev

Pythonはリスト内の複数の値のメンバーシップをテストできますか?

分類Dev

Pythonテンプレート、複数のhtmlファイルから継承する方法はありますか?

分類Dev

Python 3.xのifステートメントで「in」または「or」を使用して、変数を複数の値と照合する必要がありますか?

分類Dev

ループしているPython(groupby / transformではない)内でループして結果の重複を回避する他の方法はありますか?

分類Dev

Pythonのifステートメント内でメンバーごとの比較を組み合わせる方法はありますか?

分類Dev

Pythonで配列内のデータの数を相互に比較する簡単な方法はありますか?

分類Dev

gunicornでpython印刷ステートメントをログに記録する方法はありますか?

分類Dev

Pythonコードのインデントを壊さずに表示するために複数のリテラル行を配置する方法はありますか?

分類Dev

forループよりも高速な方法はありますか?ifステートメントはPythonの別のポイントに最も近いポイントを見つけるためですか?

分類Dev

コンピューターに複数のPythonがありますか?そしてそれらの1つをアンインストールする方法は?

分類Dev

Python:未知の範囲内でifステートメントなしで偶数を出力する方法はありますか?

分類Dev

リストで終わるが、削除やアイテムを追加することをPythonでループのためとあれば入れ子に複数を短縮する方法はありますか?

分類Dev

Python 2.7でprintステートメントまたは関数を使用する必要がありますか?

分類Dev

ifステートメントの特定の単語を除外するためのPython関数はありますか

分類Dev

Pythonで上書きせずにforループに複数のプロットを保存する方法はありますか?

分類Dev

Pythonでシリアルポートの変更を探すときにポーリングを回避する方法はありますか?

分類Dev

1行にある複数の `with`ステートメントは、Pythonのネストされた` with`ステートメントと同等ですか?

分類Dev

Pythonで複数行コメントを作成する方法はありますか?

分類Dev

Pythonで複数行コメントを作成する方法はありますか?

分類Dev

Pythonで反復変数を使用してステートメントのブロックを生成する方法はありますか?

分類Dev

SQLの「IN」ステートメントで使用されるようにPythonセットを変換する方法はありますか?

分類Dev

Pythonで文字列内の特定のシーケンスをグループ化する方法はありますか?

分類Dev

Pythonパンダで時間ベースのイベントを時間テンプレートに分割する方法はありますか?

分類Dev

Pythonは、さまざまな条件に基づいて色を割り当ててプロットする際に、複数のifステートメントを回避します

分類Dev

Python importステートメントで相対パスを使用することに意味はありますか?

分類Dev

Pythonでこの「Whileループ」/「Forループ」の相互作用を単純化する方法はありますか?

Related 関連記事

  1. 1

    Pythonで複数行のwhileステートメント(10以上の条件)を作成するより良い方法はありますか?

  2. 2

    PythonのIfステートメントで複数のfloat値を比較するより効率的な方法はありますか?

  3. 3

    Python関数の各returnステートメントの前にステートメントを実行する方法はありますか?

  4. 4

    Pythonはリスト内の複数の値のメンバーシップをテストできますか?

  5. 5

    Pythonテンプレート、複数のhtmlファイルから継承する方法はありますか?

  6. 6

    Python 3.xのifステートメントで「in」または「or」を使用して、変数を複数の値と照合する必要がありますか?

  7. 7

    ループしているPython(groupby / transformではない)内でループして結果の重複を回避する他の方法はありますか?

  8. 8

    Pythonのifステートメント内でメンバーごとの比較を組み合わせる方法はありますか?

  9. 9

    Pythonで配列内のデータの数を相互に比較する簡単な方法はありますか?

  10. 10

    gunicornでpython印刷ステートメントをログに記録する方法はありますか?

  11. 11

    Pythonコードのインデントを壊さずに表示するために複数のリテラル行を配置する方法はありますか?

  12. 12

    forループよりも高速な方法はありますか?ifステートメントはPythonの別のポイントに最も近いポイントを見つけるためですか?

  13. 13

    コンピューターに複数のPythonがありますか?そしてそれらの1つをアンインストールする方法は?

  14. 14

    Python:未知の範囲内でifステートメントなしで偶数を出力する方法はありますか?

  15. 15

    リストで終わるが、削除やアイテムを追加することをPythonでループのためとあれば入れ子に複数を短縮する方法はありますか?

  16. 16

    Python 2.7でprintステートメントまたは関数を使用する必要がありますか?

  17. 17

    ifステートメントの特定の単語を除外するためのPython関数はありますか

  18. 18

    Pythonで上書きせずにforループに複数のプロットを保存する方法はありますか?

  19. 19

    Pythonでシリアルポートの変更を探すときにポーリングを回避する方法はありますか?

  20. 20

    1行にある複数の `with`ステートメントは、Pythonのネストされた` with`ステートメントと同等ですか?

  21. 21

    Pythonで複数行コメントを作成する方法はありますか?

  22. 22

    Pythonで複数行コメントを作成する方法はありますか?

  23. 23

    Pythonで反復変数を使用してステートメントのブロックを生成する方法はありますか?

  24. 24

    SQLの「IN」ステートメントで使用されるようにPythonセットを変換する方法はありますか?

  25. 25

    Pythonで文字列内の特定のシーケンスをグループ化する方法はありますか?

  26. 26

    Pythonパンダで時間ベースのイベントを時間テンプレートに分割する方法はありますか?

  27. 27

    Pythonは、さまざまな条件に基づいて色を割り当ててプロットする際に、複数のifステートメントを回避します

  28. 28

    Python importステートメントで相対パスを使用することに意味はありますか?

  29. 29

    Pythonでこの「Whileループ」/「Forループ」の相互作用を単純化する方法はありますか?

ホットタグ

アーカイブ