このページではforループに中断条件を入れたい時に使うbreakについて解説しています。実際のコードをもとにさまざまな分岐を解説しているので、ぜひ参考にして頂ければと思います。
for文の基本については「Pythonのfor文によるループ処理の基本」で解説しています。ぜひご確認ください。
1. for文のbreakとは
for文にbreakを書くと、「特定の状況の時は処理を中断してforループを抜ける」という中断条件を作ることができます。
Pythonでは次のように書きます。
for 変数名 in イテラブル: # まず for 文を書きます。
if 文: # 次に if 文でブレイクの条件を書きます(半角4文字のインデント)。
処理文 # if文からさらにインデント(任意)。
break # 処理を中断したい場所でbreakと書きます。
処理文 # (任意)。
処理文 # 最後に for 文の処理文を書きます。
for文の下にインデントを入れてif文の中断条件を書きます。そしてifブロックの中にbreakを入れます。こうすると中断条件に該当した時にbreakしてforループを抜けます。処理を行いたい箇所に処理文を書きます。例えば、if文とbreakの間に処理文を書くと、中断条件に該当した時のみ行われる処理を作ることができます。それぞれのインデントを間違えないように注意しましょう。
流れを図にすると次のようになります(図中の「break文」は上のコードのifブロックを意味します)。
実際のコード例を見てみましょう。
次のコードは、「リストから取り出した要素が100以上の数値だった場合」を中断条件にしています。結果、100を取り出した時点でbreakしてループを終了していますね。そのため、それ以後の4、5、6は出力されていません。
nums = [1, 2, 3, 100, 4, 5, 6]
for num in nums:
if num >= 100:
print('ブレークします。')
break
print(num)
もう一個見てみましょう。これは「リストから取り出した要素が文字列だった場合」を中断条件にしています。結果、文字列を取り出した時点でforループをbreakしているため、最後の6は出力されていません。
nums = [1, 2, 3, 4, 5, 'a', 6]
for num in nums:
if isinstance(num, str):
print('ブレークします。')
break
print(num)
なお、このコードの中のisinstance関数はオブジェクトの型を真(True)か偽(False)で診断するものです。『Pythonの変数の型を調べる方法』で解説しています。
2. 多重forループのbreak
次に、以下のコードを例にして、多重forループのbreakの動作を見てみましょう。
nums1 = [1, 2, 3]
nums2 = [10, 200, 30]
for i in nums1:
for j in nums2:
print(i, j)
この多重ループは下図のような分岐になっています。
nums1から要素を1つ取り出したら内側のループに移ります。内側のループではnums2から全ての要素を取り出したら、また外側のループに戻ります。そしてnums1から次の要素を1つ取り出したら、また内側のループに入ります。このループが最終的にnums1から要素を全て取り出すまで続きます。
さて、この内側のループにbreakを入れてみましょう。
次のコードでは内側のループで、「num1から取り出した数値が2である場合、かつ、nums2から取り出した数値が100以上の場合」という条件を書いています。この条件に該当する時は’中断’と出力してから内側のループを終了して外側のループに戻ります。この条件に該当しない時は、nums2から全ての要素を取り出すまで内側の処理が繰り返されます。
nums1 = [1, 2, 3]
nums2 =[10, 20, 300]
for i in nums1:
for j in nums2:
if i == 2 and j >= 100:
print('中断')
break
print(i, j)
このコードの条件分岐は下図のようになっています。
このように多重ループの内側でbreakした場合、中断するのは内側のループのみで外側のループは中断されません。
3. elseとcontinueで全部のforループからbreak
次に内側のループと外側のループを同時にbreakする書き方も見てみましょう。このためにはcontinueとelseを組み合わせる必要があります。
次のコードをご覧ください。
nums1 = [1, 2, 3]
nums2 = [10, 20, 300]
for i in nums1:
for j in nums2:
print(i, j)
if i == 2 and j >= 20:
print('内側ループ中断')
break
else:
continue
break
まず内側のループでは、i が2で j が20以上の時にbreakします(「print(i, j)の処理がbreakの上に書かれていることに注意)。そしてbreakせずにforループを正常に終了した場合、elseブロックのcontinueが処理されます。すでに内側のループの処理を終えた後でのcontinueなので、次の処理は外側ループのbreakをスキップします。
そして、外側ループは2回目に入り、二つ目の要素である2を取り出します。すると内側ループの3回目で中断条件に該当するのでbreakして、内側ループを終了します。その後に、外側ループの処理としてbreakがあるので、そのまま外側ループも終了します。
この条件分岐経路を表したものが下図です。
おそらく混乱しやすいのは、内側のループのelseブロックに書いたcontinueではないでしょうか。continueは厳密には、その一つ後の処理をスキップします。ここでは、continueの次の処理は外側ループのbreakなので、これをスキップして、2回目の外側ループに戻っているのですね。
これによって、内側のループのbreakが処理された時のみ外側のループのbreakが処理されるようになります。
3重以上になっても書き方は同じです。
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]
nums3 = [100, 200, 300]
for i in nums1:
for j in nums2:
for k in nums3:
print(i, j, k)
if i == 2 and j == 10 and k == 100:
break # 一番内側のループのbreak
else: # 一番内側のループのelse
continue # 真ん中のループのbreakをスキップ
break # 真ん中のループのbreak
else: # 真ん中のループのelse
continue # 外側のループのbreakをスキップ
break # 外側のループのbreak
条件分岐の経路は次の通りです。内側のループでbreakすると、外側のループも全てbreakします。
ループが深くなればなるほど、Python以外の言語に精通している方は理解が難しくなるかもしれません。
しかし他言語でよくみるフラグ変数を使う方式や、『Pythonのfor文による繰り返し処理(forループ)の基本』で解説しているitertools.produt関数を使う方式よりも上記の書き方の方がより「Pythonらしい」もので、処理の速度も早いです。
4. まとめ
ここまで見てきたように、for文のbreakは、「ある条件に該当した場合に処理を中断してforループを抜ける」というコードを書くときに使います。コードを書く時にどういう条件分岐を作りたいのかの図を作るのがおすすめです。
ぜひマスターしてくださいね。
コメント