伊田生活ブログのロゴ
HOME  >  勉強
カテゴリー : 勉強 - プログラミング
•2重ループ •break •Python •VBA •ChatGPT •多重ループ
公開日:
最終更新日:

2重ループから抜ける【Python・VBA】


Pythonで2重ループから抜ける方法について、生成AI(ChatGPT)に聞きながら考えてみました。


私は仕事で最近、ちょっとしたツールを作るために、VBAとPythonを使用しています。最近、ある条件を満たしたらすぐに2重ループの外側に抜けたいという事がありました。そのようなとき、goto文が手っ取り早い方法なので、VBAで2重ループから抜けたい場合、私はgotoを使ってしまいます。(”gotoは使うな”とは、よく言われることではありますが。)

VBAでgotoを使って2重ループから抜けるコードを以下に示します。

[VBAのコード]
'Option VBASupport 1

Sub test()
    Dim i As Long
    
    c = 0
    
    For i = 1 To 1 Step 0
        For j = 1 To 1 Step 0
            c = c + 1
            MsgBox "c: " & c
            If (c = 3) Then
                MsgBox "2重ループから抜けます. c: " & c
                GoTo break
            End If
        Next j
    Next i
break:

    MsgBox "ループから抜けました."
End Sub

Pythonで2重ループから抜けるにはどうすればいいでしょうか。インターネットで調べてみましたが、Pythonではgoto文が使えないということが分かりました。そこで、ChatGPTに、以下のようなプロンプト(生成AIへ出す指示の文章のこと)を送って、聞いてみました。

---
以下のVBAのコードを、Pythonで記述してください。
---

以下に、2重ループから抜けるPythonのサンプルコードを示します。

[フラグを使わない]
def test():
    c = 0

    for i in iter(lambda: 1, None):  # 無限ループ
        for j in iter(lambda: 1, None):  # 無限ループ
            c += 1
            print(f"c: {c}")

            if c == 3:
                print(f"2重ループから抜けます. c: {c}")
                break
        if c == 3:
            break
    print("ループから抜けました.")

# 実行
test()

このコードは、if c == 3:という条件を2回記述しています。そのため、条件を修正する場合、2か所修正しなければいけないのが難点です。

フラグを使って条件を判定し2重ループから抜けるコードを以下に示します。

[フラグを使う]
def test():
    c = 0
    exit_flag = False  # フラグを用意

    for i in iter(lambda: 1, None):  # 無限ループ (i)
        for j in iter(lambda: 1, None):  # 無限ループ (j)
            c += 1
            print(f"c: {c}")

            if c == 3:
                print(f"2重ループから抜けます. c: {c}")
                exit_flag = True  # フラグをセット
                break  # 内側のループを抜ける

        if exit_flag:  # フラグをチェックして外側のループも抜ける
            break
    print("ループから抜けました.")

# 実行
test()

このコードは exit_flag という変数をフラグにしています。フラグで2重ループから抜けるかどうか、判定しています。

このコードは、フラグを使わない方法と比較して、exit_flag という変数を使用している分、コードが長くなっているのが難点です。しかし、if c == 3:という条件の記述は1か所なので、コードが分かりやすいという利点があります。


2重ループから抜ける方法について、VBAのコードをもとにして、ChatGPTに2つのコード(フラグを使う/使わない)を書いてもらいました。

この記事に記載した2つのPythonのコードは、ChatGPTが最初に出力したものではありません。何回か修正を加えています。たとえば、フラグを使わないコードとして、ChatGPTは最初、以下のようなコードを出力しました。

def test():
    c = 0

    for i in iter(lambda: 1, None):  # 無限ループ
        for j in iter(lambda: 1, None):  # 無限ループ
            c += 1
            print(f"c: {c}")

            if c == 3:
                print(f"2重ループから抜けます. c: {c}")
                return  # 外側のループも含めて終了

# 実行
test()

このコードは break ではなく return でループを終了しています。これは本来やりたかった方法ではないので、break を使うように、修正しました。

このように、生成AIは求めているコードとは違うコードを出力することもあるので、その場合は修正が必要となります。