このページではforループに中断条件を入れたい時に使うcontinueについて解説しています。実際のコードや図で詳しく解説しているので、ぜひ学習にご活用ください。
for文の基本については「Pythonのfor文によるループ処理の基本」で解説しています。ぜひご確認ください。
1. for文のcontinueとは
for文のcontinueは「特定の条件の時に処理をスキップしてループの次の処理に戻る」というスキップ条件を作るものです。
Pythonでは次のように書きます。
for 変数名 in イテラブル: # まず for 文を書きます。
if 文: # 次に if 文でスキップの条件を書きます(半角4文字のインデント)。
処理文 # if文からさらにインデント(任意)。
continue # 処理をスキップしたい場所でcontinueと書きます。
処理文 # (任意)。
処理文 # for文の処理文(任意)
for文の下にインデントを入れてif文でスキップ条件を書きます。そしてif文の中にcontinueを入れます。条件を満たすと処理をスキップして次のループに移ります。この流れを図にすると次のようになります(実際はcontinueはifブロックの中にあります)。
実際にコードを見て確認してみましょう。
次のコードは、スキップ条件が「リストから取り出した要素が整数でない場合」になっています。つまり文字列を取り出した時は処理がスキップされて、ループに戻り、リストの次の要素を取得しています。
list = [1, 'a', 2, 'b', 3, 'c']
for i in list:
if not isinstance(i, int):
continue
print(i)
スキップ条件を「リストから取り出した要素が文字列でない場合」にすると、数値を取り出した時は処理がスキップされます。
list = [1, 'a', 2, 'b', 3, 'c']
for i in list:
if not isinstance(i, str):
continue
print(i)
なお、このコードの中のisinstance関数はオブジェクトの型を真(True)か偽(False)で診断するものです。『Pythonの変数の型を調べる方法』で解説しています。
次のコードを見ると、より流れが分かりやすいでしょう。
list = [1, 'a', 2, 'b', 3, 'c', 4]
sum = 0
for i in list:
if not isinstance(i, int):
print(f'{i}/スキップ')
continue
sum += i
print(f'取り出した数値は{i}/合計{sum}')
2. 多重forループのcontinue
続いてforループが多重ループの場合の動作を見ていきましょう。次の多重ループを例に解説します。
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から要素を全て取り出すまで続きます。
さて、この内側のループにcontinueを入れてみましょう。
次のコードでは、内側のループが変数jに取り出した値が20の時は、「print(‘—スキップ—‘)」を実行してからcontinueがあり、その後の処理「print(i, j)」をスキップするようになっています。
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]
for i in nums1:
for j in nums2:
if j == 20:
print('---スキップ---')
continue
print(i, j)
jの値が20の時は処理がスキップされていますね。この条件分岐経路は下図のようになっています。内側のループでスキップした時は、内側のループの次の処理に戻ります。
続いて外側のループと内側のループの両方にcontinueを入れてみましょう。次のコードでは外側のループは数値の3を取り出した時に、その下の処理「for j in nums2」をスキップします。そして、内側のループでは数値の20を取り出した時にスキップします。
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]
for i in nums1:
if i == 3:
continue
for j in nums2:
if j == 20:
print('---スキップ---')
continue
print(i, j)
この条件分岐経路の流れを示したものが下図です。
外側のループでスキップ条件に該当した時は、内側のループ処理をスキップしていますね。内側のループでスキップ条件に該当した時は、内側のループの次の処理に移っています。
3. elseとcontinueで外側のループの処理をスキップする
elseブロックにcontinueを書くと、外側のループの処理をスキップすることができます。なお、elseについては「Pythonのfor文のelseの使い方」をご確認ください。
それでは次のコードを見てみましょう。外側のループの処理である「print(‘外側ループの処理です。’)」が実行されていないことがわかりますね。
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]
for i in nums1:
for j in nums2:
print(i, j)
else:
continue
print('外側ループの処理です。')
最後の「print(‘外側ループの処理です’)」が出力されないのは、次のような経路になっているからです。
このように、elseブロックの中にcontinueを書くと、それ以降に書かれているループの外側の処理を全てスキップします。
これを使うと、以下のコードのように内側ループでbreak条件に該当した時は、外側を含む全てのループを抜けるというような条件分岐経路を作ることができます。なお、breakについては「Pythonのforループのbreak」をご覧ください。
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
この条件分岐経路は下図のようになっています。
このようにcontinueだけの場合はループ内の処理をスキップして、次の処理に映りますが、elseブロックの中にcontinueを書くと、ループの外側の処理をスキップすることができるのです。
4. まとめ
for文のcontinueは、特定の条件の時に処理をスキップして次の処理に移る、というものです。多重ループでの挙動と、continueをelseブロックの中に書いた時の挙動も頭に入れておきましょう。
また、for文については以下のページをあわせて読んで頂くと、さらに理解が深まります。
ぜひご活用ください。
コメント