Pythonのforループでのcontinue (スキップ条件)の使い方

このページではforループに中断条件を入れたい時に使うcontinueについて解説しています。実際のコードや図で詳しく解説しているので、ぜひ学習にご活用ください。

for文の基本について
for文の基本については「Pythonのfor文によるループ処理の基本」で解説しています。ぜひご確認ください。
目次

1. for文のcontinueとは

for文のcontinueは「特定の条件の時に処理をスキップしてループの次の処理に戻る」というスキップ条件を作るものです。

Pythonでは次のように書きます。

In [ ]:
for 変数名 in イテラブル:   # まず for 文を書きます。
    if :                    # 次に if 文でスキップの条件を書きます(半角4文字のインデント)。
        処理文             # if文からさらにインデント(任意)。
        continue         # 処理をスキップしたい場所でcontinueと書きます。
        処理文             # (任意)。
    処理文                 # for文の処理文(任意)

for文の下にインデントを入れてif文でスキップ条件を書きます。そしてif文の中にcontinueを入れます。条件を満たすと処理をスキップして次のループに移ります。この流れを図にすると次のようになります(実際はcontinueはifブロックの中にあります)。

実際にコードを見て確認してみましょう。

次のコードは、スキップ条件が「リストから取り出した要素が整数でない場合」になっています。つまり文字列を取り出した時は処理がスキップされて、ループに戻り、リストの次の要素を取得しています。

In [1]:
list = [1, 'a', 2, 'b', 3, 'c']

for i in list:
    if not isinstance(i, int):
        continue
    print(i)
1
2
3

スキップ条件を「リストから取り出した要素が文字列でない場合」にすると、数値を取り出した時は処理がスキップされます。

In [2]:
list = [1, 'a', 2, 'b', 3, 'c']

for i in list:
    if not isinstance(i, str):
        continue
    print(i)
a
b
c

なお、このコードの中のisinstance関数はオブジェクトの型を真(True)か偽(False)で診断するものです。『Pythonの変数の型を調べる方法』で解説しています。

次のコードを見ると、より流れが分かりやすいでしょう。

In [3]:
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}')
取り出した数値は1/合計1
a/スキップ
取り出した数値は2/合計3
b/スキップ
取り出した数値は3/合計6
c/スキップ
取り出した数値は4/合計10

2. 多重forループのcontinue

続いてforループが多重ループの場合の動作を見ていきましょう。次の多重ループを例に解説します。

In [1]:
nums1 = [1, 2, 3]
nums2 = [10, 200, 30]

for i in nums1:
    for j in nums2:
        print(i, j)
1 10
1 200
1 30
2 10
2 200
2 30
3 10
3 200
3 30

この多重ループは下図のような分岐になっています。

nums1から要素を1つ取り出したら内側のループに移ります。内側のループではnums2から全ての要素を取り出したら、また外側のループに戻ります。そしてnums1から次の要素を1つ取り出したら、また内側のループに入ります。このループが最終的にnums1から要素を全て取り出すまで続きます。

さて、この内側のループにcontinueを入れてみましょう。

次のコードでは、内側のループが変数jに取り出した値が20の時は、「print(‘—スキップ—‘)」を実行してからcontinueがあり、その後の処理「print(i, j)」をスキップするようになっています。

In [1]:
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]

for i in nums1:
    for j in nums2:
        if j == 20:
            print('---スキップ---')
            continue
        print(i, j)
1 10
---スキップ---
1 30
2 10
---スキップ---
2 30
3 10
---スキップ---
3 30

jの値が20の時は処理がスキップされていますね。この条件分岐経路は下図のようになっています。内側のループでスキップした時は、内側のループの次の処理に戻ります。

続いて外側のループと内側のループの両方にcontinueを入れてみましょう。次のコードでは外側のループは数値の3を取り出した時に、その下の処理「for j in nums2」をスキップします。そして、内側のループでは数値の20を取り出した時にスキップします。

In [2]:
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)
1 10
---スキップ---
1 30
2 10
---スキップ---
2 30

この条件分岐経路の流れを示したものが下図です。

外側のループでスキップ条件に該当した時は、内側のループ処理をスキップしていますね。内側のループでスキップ条件に該当した時は、内側のループの次の処理に移っています。

3. elseとcontinueで外側のループの処理をスキップする

elseブロックにcontinueを書くと、外側のループの処理をスキップすることができます。なお、elseについては「Pythonのfor文のelseの使い方」をご確認ください。

それでは次のコードを見てみましょう。外側のループの処理である「print(‘外側ループの処理です。’)」が実行されていないことがわかりますね。

In [1]:
nums1 = [1, 2, 3]
nums2 = [10, 20, 30]
for i in nums1:
    for j in nums2:
        print(i, j)
    else:
        continue
    print('外側ループの処理です。') 
1 10
1 20
1 30
2 10
2 20
2 30
3 10
3 20
3 30

最後の「print(‘外側ループの処理です’)」が出力されないのは、次のような経路になっているからです。

このように、elseブロックの中にcontinueを書くと、それ以降に書かれているループの外側の処理を全てスキップします。

これを使うと、以下のコードのように内側ループでbreak条件に該当した時は、外側を含む全てのループを抜けるというような条件分岐経路を作ることができます。なお、breakについては「Pythonのforループのbreak」をご覧ください。

In [1]:
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
1 10
1 20
1 300
2 10
2 20
内側ループ中断

この条件分岐経路は下図のようになっています。

このようにcontinueだけの場合はループ内の処理をスキップして、次の処理に映りますが、elseブロックの中にcontinueを書くと、ループの外側の処理をスキップすることができるのです。

4. まとめ

for文のcontinueは、特定の条件の時に処理をスキップして次の処理に移る、というものです。多重ループでの挙動と、continueをelseブロックの中に書いた時の挙動も頭に入れておきましょう。

また、for文については以下のページをあわせて読んで頂くと、さらに理解が深まります。

ぜひご活用ください。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる