---
title: "Python continueの使い方｜breakとの違いと3.14のfinally警告を実行例で解説"
url: "https://www.issoh.co.jp/tech/details/17899/"
published: 2026-09-27
updated: 2026-09-27
categories: ["Python"]
publisher: "株式会社一創"
---

# 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節](https://docs.python.org/ja/3/reference/simple%5Fstmts.html#the-continue-statement)は、continue を「最も内側のループの次の周回へ進む文」と定めています。書ける場所は for 文と while 文の中だけです。

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

[公式チュートリアルの4.4節](https://docs.python.org/ja/3/tutorial/controlflow.html#break-and-continue-statements)に載っている例を、そのまま動かせる形にしました。偶数のときはメッセージを出して 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):` で書けばこの種の事故は起きません。反復と再帰の書き分けは[フィボナッチ数列を再帰と反復で実装する記事](https://www.issoh.co.jp/tech/details/2755/)でも扱っています。

### 二重ループでの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節](https://docs.python.org/ja/3/tutorial/controlflow.html#else-clauses-on-loops)の説明どおり、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](https://docs.python.org/ja/3/whatsnew/3.8.html) で実装上の制限が外れて書けるようになり、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の使い方を扱った記事](https://www.issoh.co.jp/tech/details/4348/)にまとめています。

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

逆向き、つまり finally の中に continue を置くと話が変わります。[PEP 765](https://peps.python.org/pep-0765/) は、finally から外へ抜ける return・break・continue に SyntaxWarning を出すと定め、3.14 で実装されました。[What’s New in Python 3.14](https://docs.python.org/ja/3/whatsnew/3.14.html#pep-765-control-flow-in-finally-blocks) にも同じ変更が載っています。

```
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の新機能まとめ](https://www.issoh.co.jp/tech/details/9409/)を参照してください。

## 実務コードでの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を扱った記事](https://www.issoh.co.jp/tech/details/3032/)が参考になります。

### 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](https://peps.python.org/pep-3136/)は Rejected で終わっています。代わりの書き方は3つです。

第1に、ループ全体を関数に切り出して return で抜ける方法。最も読みやすく、まずこれを検討してください。第2に、[itertools.product](https://docs.python.org/ja/3/library/itertools.html#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のバージョンを管理する方法](https://www.issoh.co.jp/tech/details/4384/)が手軽です。点検の範囲が広く、改修と合わせて作り直しを検討する段階であれば、[フルスクラッチ開発](https://www.issoh.co.jp/service/system/fullscratch/)の相談窓口で既存コードの調査から承っています。

## よくある質問

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 で明示的に扱ってください。

## 関連記事

- [Python 3.14の新機能まとめ｜JITコンパイラ・フリースレッド版(GIL撤廃)・t-stringを最新版で解説](https://www.issoh.co.jp/tech/details/9409/)：finally内の制御文の警告を含む3.14の変更点
- [エラーハンドリングとは？例外処理との違いとtry-catch-finallyの使い方](https://www.issoh.co.jp/tech/details/4348/)：continue と組み合わせる例外処理の基本
- [PEP8とは？Pythonコーディング規約の基本ルールとチェックツール（Ruff対応）](https://www.issoh.co.jp/tech/details/3032/)：ガード節の書き方を揃える規約とLinter
- [Python MQTT実装｜paho-mqtt 2系のループ方式と再接続を実装目線で解説](https://www.issoh.co.jp/tech/details/16866/)：常駐プロセスで回すループの実装例

---

出典: [Python continueの使い方｜breakとの違いと3.14のfinally警告を実行例で解説](<https://www.issoh.co.jp/tech/details/17899/>)（株式会社一創）
