Python

Python continueの使い方|breakとの違いと3.14のfinally警告を実行例で解説

Python continueの使い方|breakとの違いと3.14のfinally警告を実行例で解説

Pythonの continue は、ループの残りの処理を飛ばして次の周回へ進む文です。書き方は1語で終わりますが、while文ではカウンタの位置しだいで無限ループになり、finally の中に置くと Python 3.14 から SyntaxWarning が出ます。この記事では、for文・while文での動き、break・pass との違い、構文エラーになる条件、実務でのガード節の書き方までを、Python 3.14.6 で実行した出力つきで整理しました。

まとめ|Python continueの役割とbreak・passとの使い分けの要点

continue は「この周回だけ打ち切る」、break は「ループそのものを抜ける」、pass は「何もしない」です。迷ったら、次の要素を処理し続けたいかどうかで選んでください。

事故が起きやすいのは2か所です。1つは while 文で、カウンタを増やす行より前に continue を置くと条件が変わらず抜けられません。もう1つは try 文の finally で、ここに置いた continue は例外を黙って捨てます。Python 3.14 はこの書き方に警告を出すようになりました。

実務での使いどころは、不正なデータを先に弾いて本処理の入れ子を浅くするガード節です。反対に、リストを絞り込むだけなら内包表記のほうが短く書けます。多重ループを一度に抜ける構文は Python にありません。関数に切り出して return するのが素直な解です。

continueの基本動作|for文とwhile文で次の周回へ進む仕組みの確認

言語リファレンスの7.10節は、continue を「最も内側のループの次の周回へ進む文」と定めています。書ける場所は for 文と while 文の中だけです。

for文でのcontinue|偶数を飛ばす公式チュートリアル例の出力

公式チュートリアルの4.4節に載っている例を、そのまま動かせる形にしました。偶数のときはメッセージを出して continue し、その下の print を飛ばします。

for num in range(2, 10):
    if num % 2 == 0:
        print(f"偶数 {num} を見つけた")
        continue
    print(f"奇数 {num} を見つけた")

出力は「偶数 2」「奇数 3」「偶数 4」と交互に8行並び、9で終わります。continue の後ろにある行は、その周回では一度も実行されません。for 文ではイテレータが次の要素を自動で渡すので、continue を置いても周回が止まる心配はありません。

while文でのcontinue|カウンタ更新の前に置くと無限ループになる理由

while 文では事情が違います。次の周回へ進むかどうかは条件式だけで決まり、値を進めるのは書き手の役目です。

# 誤り:i が 2 のまま増えず、ループから出られない
i = 0
while i < 5:
    if i == 2:
        continue
    print(i)
    i += 1

# 修正:値を進める行を continue より前に置く
i = 0
while i < 5:
    i += 1
    if i == 3:
        continue
    print("w", i)

修正版の出力は w 1、w 2、w 4、w 5 の4行です。while 文で continue を使うなら、値を進める処理はループ本体の先頭に置くのが安全です。回数が決まっている処理なら、最初から for i in range(5): で書けばこの種の事故は起きません。反復と再帰の書き分けはフィボナッチ数列を再帰と反復で実装する記事でも扱っています。

二重ループでのcontinue|効くのは最も内側のループだけという仕様

ループが入れ子になっていても、continue が飛ばすのは自分を囲む一番内側のループの周回だけです。外側のループは何事もなかったように続きます。「外側の次の要素へ進みたい」場合に内側で continue を書いても期待どおりには動きません。この場合の書き方は、後半の多重ループの章で3通り示します。

break・pass・returnとの違い|ループ制御の4つの文を挙動で比べる

ループの中で流れを変える文は4つあります。混同されやすいのは continue と pass で、どちらも「何かを飛ばす」印象がありますが、動きは別物です。

4つの文の比較表|ループを続けるか抜けるかとelse節が動くかの差

文 ループ 後続の行 else節 主な用途
continue 続ける この周回は飛ばす 実行される 不要な要素の除外
break 抜ける 飛ばす 実行されない 見つけたら終了
pass 続ける そのまま実行 実行される 空の本体の穴埋め
return 関数ごと抜ける 飛ばす 実行されない 多重ループの脱出

pass は文法上ブロックが必要な場所を埋めるだけで、制御の流れを一切変えません。if の中に pass を書いても、下の行は普通に実行されます。「処理を飛ばしたつもりで pass を書いた」というバグは、この表の3列目で見分けられます。

for-else節とcontinue|全周回を飛ばした場合のelse節の実行結果

for 文と while 文には else 節を付けられます。チュートリアルの4.5節の説明どおり、else 節は break で抜けなかったときに実行されます。

for n in [1, 3, 5]:
    if n % 2:
        continue
else:
    print("else 実行")

全周回で continue が走っても、出力は「else 実行」です。continue はループを終わらせないので、else 節の発動条件には関わりません。else 節を「全要素が条件を満たさなかった」判定に使うなら、分岐は break の有無で組んでください。

continueが構文エラーになる3つの書き方|ループ外・内包表記・入れ子の関数

continue はどこにでも書けるわけではありません。3.14.6 で試すと、次の3つはいずれもコンパイル時点で SyntaxError になります。

  • ループの外:'continue' not properly in loop
  • ループの中で定義した関数の中:同じく 'continue' not properly in loop
  • リスト内包表記の中:invalid syntax

2つ目は見落としやすい例です。コールバック関数をループ内で定義し、その中から外側のループを進めようとしても書けません。リファレンスが「ループ内の関数定義やクラス定義の中には書けない」と明記している条件です。内包表記は式なので文である continue を置けず、除外したい要素は末尾の if で落とします。

try・finallyとcontinue|Python 3.14の警告とPEP 765

try 文と組み合わせたときの continue は、Python の版によって扱いが3回変わりました。3.7 までは finally の中に書くと SyntaxError、3.8 で実装上の制限が外れて書けるようになり、3.14 では finally から外へ抜ける場合に SyntaxWarning という警告の対象になっています。

tryの中のcontinueでもfinallyは実行される|後始末が漏れない順序

try ブロックの中で continue しても、finally 節は必ず先に実行されます。ファイルやロックの後始末を finally に書いておけば、周回を途中で打ち切っても漏れません。

for i in range(3):
    try:
        if i == 1:
            continue
        print("body", i)
    finally:
        print("finally", i)

出力は body 0、finally 0、finally 1、body 2、finally 2 の順です。i が 1 の周回では body は出ませんが、finally 1 は出ています。例外処理全般の組み立て方はtry・catch・finallyの使い方を扱った記事にまとめています。

finally内のcontinue|3.14の警告と例外を握りつぶす仕組み

逆向き、つまり finally の中に continue を置くと話が変わります。PEP 765 は、finally から外へ抜ける return・break・continue に SyntaxWarning を出すと定め、3.14 で実装されました。What’s New in Python 3.14 にも同じ変更が載っています。

def load(rows):
    out = []
    for row in rows:
        try:
            out.append(int(row))
        finally:
            continue  # 3.14 では SyntaxWarning
    return out

print(load(["1", "x", "3"]))  # [1, 3]

“x” の変換で ValueError が起きているのに、関数は何も言わずに [1, 3] を返します。finally の continue が、伝わるはずだった例外を捨てたためです。PEP 765 の調査では、PyPI上位8,000パッケージで100万行あたり2件と珍しい書き方ですが、見つかった例の多くがこの種の握りつぶしでした。CI で python -W error を付けて走らせると警告が SyntaxError に昇格するので、混入を止められます。3.14 のほかの変更点はPython 3.14の新機能まとめを参照してください。

実務コードでのcontinue|ガード節で入れ子を浅くする書き方と避ける場面

continue が役に立つのは、ループ本体の冒頭で「処理しない要素」を先に弾く場面です。どこまで使い、どこから別の書き方に替えるかを決めておくと、コードレビューで揉めません。

ガード節としてのcontinue|CSVの不正行を飛ばして処理を平らにする例

取り込んだCSVに空欄や数値以外の値が混ざる、というのはよくある状況です。if を入れ子にする代わりに、弾く条件ごとに continue で抜けると、本処理がインデント1段で済みます。

import csv
import io

data = "id,price\n1,100\n2,\n3,abc\n4,250\n"
total = 0
skipped = []
for lineno, row in enumerate(csv.DictReader(io.StringIO(data)), start=2):
    price = row["price"].strip()
    if not price:
        skipped.append((lineno, "空欄"))
        continue
    if not price.isdigit():
        skipped.append((lineno, "数値以外"))
        continue
    total += int(price)

print(total, skipped)  # 350 [(3, '空欄'), (4, '数値以外')]

ポイントは、飛ばした行を捨てずに skipped へ記録していることです。continue だけで黙って飛ばすと、取り込み件数が合わない原因を後から追えません。ガード節の書き方を揃える規約づくりはPEP8とRuffを扱った記事が参考になります。

continueを使わないほうがよい場面|内包表記とfilterへの置き換え

ループの目的が「条件に合う要素だけを集める」なら、continue は不要です。[100 // n for n in nums if n != 0] と内包表記で書けば1行で済み、nums が [3, 0, 7, 0, 2] なら結果は [33, 14, 50] です。変換を伴わず除外だけなら、list(filter(None, nums)) で0を落とす書き方もあり、結果は [3, 7, 2] になります。

逆に、1つのループの中に continue が4つも5つも並ぶなら、ループが仕事を抱えすぎています。判定部分を関数に切り出し、その関数が False を返したら continue する形にまとめると、読む側は条件を1か所で確認できます。

多重ループを一度に抜ける方法|ラベル付きbreakが却下された経緯と代替

Java や Go のラベル付き break・continue に相当する構文は Python にありません。2007年に提案されたPEP 3136は Rejected で終わっています。代わりの書き方は3つです。

第1に、ループ全体を関数に切り出して return で抜ける方法。最も読みやすく、まずこれを検討してください。第2に、itertools.product で二重ループを1重に畳む方法で、for a, b in product(range(3), range(3)): と書けば break 1回で全体を抜けられます。第3に、for-else を使う方法です。

matrix = [[1, 2], [3, -4], [5, 6]]
for r, row in enumerate(matrix):
    for v in row:
        if v < 0:
            break
    else:
        continue      # 内側が break しなければ次の行へ
    print("negative row", r)
    break             # 内側が break したら外側も抜ける

出力は negative row 1 です。動きはしますが、else と continue の組み合わせを一目で読める人は多くありません。チームで保守するコードなら、第1の関数化を選ぶのが無難です。

continueが多い既存コードを引き継ぐときに確認する三つの観点

引き継いだ業務コードに continue が散らばっている場合、確認するのは3点です。第1に、finally の中に continue や return がないか。3.14 へ上げると警告が出る箇所で、例外が握りつぶされている可能性があります。第2に、continue で飛ばした件数がどこかに記録されているか。第3に、while 文の continue の前で値が進んでいるか。

この3点は、Python のバージョンを上げるときにまとめて点検すると手戻りが減ります。手元で 3.14 を試すならuvでPythonのバージョンを管理する方法が手軽です。点検の範囲が広く、改修と合わせて作り直しを検討する段階であれば、フルスクラッチ開発の相談窓口で既存コードの調査から承っています。

よくある質問

continue について検索されることの多い5つの疑問に答えます。

continueとbreakの違いは何ですか?

continue はその周回の残りを飛ばして次の周回へ進み、ループは続きます。break はループそのものを終了する文で、実行が移る先はループの後ろの行です。range(1, 6) のループで3のときに使うと、continue なら 1・2・4・5 が、break なら 1・2 だけが出力されます。else 節は continue では実行され、break では実行されません。

continueとpassはどう使い分けますか?

pass は何もしない文で、制御の流れを変えません。if の中に pass を書いても、その下の行は実行されます。空の関数や空の if ブロックのように、文法上何か書く必要がある場所を埋めるのが pass の役目です。周回を飛ばしたいなら continue を使ってください。

while文でcontinueを使うと止まらなくなるのはなぜですか?

ループ条件に使う変数を増やす行が、continue より後ろにあるためです。continue した周回ではその行が実行されず、条件が変わらないまま同じ判定を繰り返します。値を進める行をループ本体の先頭に移すか、回数が決まっているなら for 文と range() に書き換えてください。

二重ループの外側を次へ進めるcontinueはありますか?

ありません。continue が効くのは最も内側のループだけで、ラベル付きの continue を提案した PEP 3136 は却下されています。外側を進めたい場合は、内側を関数にして結果を返す、itertools.product で1重にまとめる、for-else で内側が break したかを判定する、のいずれかで書きます。

finallyの中でcontinueを使うと警告が出るのはなぜですか?

Python 3.14 から、finally ブロックを抜ける return・break・continue に SyntaxWarning が出るようになったためです(PEP 765)。finally の中で continue すると、try で起きた例外が捨てられ、エラーが起きたことに気づけません。continue は try の中へ移し、例外は except で明示的に扱ってください。

関連記事

お気に入りに入れた記事の一覧

この記事は以下の記事からリンクされています

資料請求

今日のトレンド記事 直近 24 時間で、いつもより多く読まれている記事

  1. 2026.09.25 コラム 障害者雇用の助成金一覧:月いくら・支給要件と申請書類を勤怠データで揃える方法
  2. 2026.09.25 コラム 最低賃金引き上げ【令和8年度】47都道府県の改定額・発効日と企業の対応手順
  3. 2026.09.28 テックブログ タイムズカーの不正アクセスと約660万件の流出|免許証画像を退会者まで残さない保管設計
  4. 2026.04.03 テックブログ マイナビ情報漏洩11万件|不正アクセスの経緯・対象確認と「登録は危険か」の判断材料
  5. 2026.09.27 コラム 営業利益率の目安は?業種別・規模別の平均を最新統計で比べ、自社の目標を決める方法【2026年版】

RELATED POSTS 関連記事

目次