2重ループから抜ける【Python・VBA】
Pythonで2重ループから抜ける方法について、生成AI(ChatGPT)に聞きながら考えてみました。
• goto文で2重ループから抜ける
私は仕事で最近、ちょっとしたツールを作るために、VBAとPythonを使用しています。最近、ある条件を満たしたらすぐに2重ループの外側に抜けたいという事がありました。そのようなとき、goto文が手っ取り早い方法なので、VBAで2重ループから抜けたい場合、私はgotoを使ってしまいます。(”gotoは使うな”とは、よく言われることではありますが。)
VBAでgotoを使って2重ループから抜けるコードを以下に示します。
[VBAのコード]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のコード
Pythonで2重ループから抜けるにはどうすればいいでしょうか。インターネットで調べてみましたが、Pythonではgoto文が使えないということが分かりました。そこで、ChatGPTに、以下のようなプロンプト(生成AIへ出す指示の文章のこと)を送って、聞いてみました。
以下のVBAのコードを、Pythonで記述してください。
---
フラグを使わないコード
以下に、2重ループから抜けるPythonのサンプルコードを示します。
[フラグを使わない]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重ループから抜けるコードを以下に示します。
[フラグを使う]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は最初、以下のようなコードを出力しました。
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は求めているコードとは違うコードを出力することもあるので、その場合は修正が必要となります。