1. ホーム
  2. python

[解決済み] Pythonです。外周ループで次の反復に進む

2022-04-25 01:53:28

質問

Pythonのアウターループで次の反復に進むための組み込みの方法があるかどうかを知りたかったのです。 例えば、次のようなコードを考えてみましょう。

for ii in range(200):
    for jj in range(200, 400):
        ...block0...
        if something:
            continue
    ...block1...

このcontinue文は、jjループを終了し、iiループの次のアイテムに移動したいです。 このロジックは他の方法(フラグ変数を設定する)で実装することができますが、これを行う簡単な方法はありますか?

どのように解決するのですか?

for i in ...:
    for j in ...:
        for k in ...:
            if something:
                # continue loop i

一般的なケースでは、複数レベルのループがある場合や break がうまくいかない場合 (現在のループのすぐ上ではなく、上のループを継続したいため) は、次のいずれかを実行します。

脱出したいループを関数にリファクタリングする。

def inner():
    for j in ...:
        for k in ...:
            if something:
                return


for i in ...:
    inner()

不利な点は、新しい関数に、以前はスコープ内にあった変数を渡す必要があるかもしれないことです。パラメータとして渡すか、オブジェクトのインスタンス変数にするか(この関数のためだけに新しいオブジェクトを作成する、それが意味をなすなら)、グローバル変数、シングルトン、何でもありです(えーと、えーと)。

または inner を入れ子にして、必要なものだけを取り込むようにします (もっと遅いかも?)。

for i in ...:
    def inner():
        for j in ...:
            for k in ...:
                if something:
                    return
    inner()

例外を利用する

哲学的に言えば、例外とは、構造化されたプログラミングの構成要素(if, for, while)を通じて、必要に応じてプログラムの流れを断ち切るためにあるものなのです。

メリットは、1つのコードを複数に分割する必要がないことです。Pythonで書きながら設計しているのが何らかの計算であれば、これは良いことです。この早い段階で抽象化を導入すると、スピードが落ちる可能性があります。

この方法の悪い点は、インタプリタやコンパイラの作者は通常、例外は例外であると仮定し、それに応じて最適化することです。

class ContinueI(Exception):
    pass


continue_i = ContinueI()

for i in ...:
    try:
        for j in ...:
            for k in ...:
                if something:
                    raise continue_i
    except ContinueI:
        continue

このために特別な例外クラスを作成し、誤って他の例外を黙殺してしまうリスクを回避するようにします。

全く別のもの

まだ他にも解決策はあると思います。