【Python】continue文の使い方を初心者向けに解説 - 条件を飛ばしてループ処理を効率化
はじめに
Pythonで繰り返し処理をする際、特定の条件を満たす場合だけ処理を飛ばしたいことがあるのではないでしょうか。
たとえば、大量のデータを読み込んでいて、不要な行を素早くスキップしたい場面です。 あるいはフォーム入力のバリデーションチェック中に、特定の条件に合致したときだけ処理を次に進まず別の分岐へ回したいケースも考えられます。
そうした場面で役立つのが、continue文 です。 ループを中断するわけではなく、ある条件下で次の繰り返しステップへ移ることができます。 break文と違ってループ自体を終了させるわけではなく、必要な部分の処理を省略できるのが特長です。
この記事では、continue文の基本構文や使用シーン、実務での活用例などを順番に解説します。 初心者の方でも理解しやすいよう、実際のコード例を交えて分かりやすく説明していきます。
この記事を読むとわかること
- continue文の基本的な働きと書き方
- for文やwhile文での活用方法とコード例
- break文との違いと使いどころ
- 実務での利用シーンや注意点
- コードの可読性を高めるポイント
continue文とは何か?
Pythonで繰り返し処理をする場合、よく使う構文として for文 や while文 があります。 これらのループでは、一定の回数や条件をもとにして同じブロック内の処理を繰り返すことができます。
しかし、繰り返しの途中で「ここだけはスキップしたい」というケースが出てくることがあります。 そのときに役立つのが、continue文 です。
簡単な例
例えば下記のように、numbersリストから偶数だけを表示して奇数の場合は表示せず処理を先に進めたいケースを考えてみます。
numbers = [1, 2, 3, 4, 5, 6] for num in numbers: if num % 2 != 0: continue print(num)
上の例では、num % 2 != 0
(numを2で割った余りが0でない)つまり 奇数 のとき、continue
が実行されます。
すると、その場で残りの処理を飛ばして 次のループへ 進むことになるため、print(num)
は実行されません。
結果的に表示されるのは2、4、6のみです。
ループを終了させない
continue
は「その時点の処理をスキップして次の繰り返し処理へ移る」命令であり、ループ自体を終了させるわけではありません。
ループを完全に終了させたい場合は break文 を使う必要があります。
これらの挙動の違いがはっきりしているからこそ、状況に応じて適切に使い分けられるようにしておくことが大事です。
continueを使う目的
プログラムを組んでいると、すべての繰り返し処理が同じ重みではないと感じる瞬間があります。
たとえば、大量のデータを読み込む際に一部だけ不要な情報が混ざっている場合、その部分の処理にリソースを費やすのは無駄になります。 また、ユーザー入力のバリデーションロジックにおいて、特定条件の入力が来たときだけエラー処理をスキップして別の項目のチェックへ移りたいこともあるでしょう。
こうした場面で continue
を使うと、余分な処理を省きつつ、ループ自体は継続できるので効率が上がります。
具体的なメリット
- 不要な処理をスキップ:必要ない要素に対して実行するコードを避けられる
- 条件分岐を読みやすく:if文を増やしすぎず、スキップすべき条件だけを明確に書ける
- コードの可読性を向上:深いネストを作らなくても「特定条件を飛ばす」という意図が伝わりやすい
実務では膨大なデータを取り扱うことが多いので、パフォーマンス上の理由や可読性のためにも continue
は役立ちます。
forループとcontinue
もっとも基本的な使い方として、for文 との組み合わせがあります。 配列やリスト、タプルなどの要素を順番に処理するときに、条件によって「この要素はスキップしたい」という場面で使われます。
例1: 負数だけスキップ
プログラミングで数値を扱う際に、正の数だけを処理したいという場面をイメージしてください。 負数を見つけたら、その処理は無視して次のループへ移りたいときは下記のように書きます。
values = [10, -1, 8, -3, 12] for v in values: if v < 0: continue # vが正の数だった場合のみ出力 print(v)
上の例では、-1 や -3 が出てきた瞬間に continue
が呼び出されて、print(v) の部分はスキップされます。
最終的に出力されるのは 10, 8, 12 となります。
例2: 文字列操作で特定条件を回避
文字列のリストを扱うとき、たとえば空文字や特定の文字が含まれる場合は処理を飛ばすなどのケースも考えられます。
names = ["Alice", "", "Bob", "Charlie", ""] for name in names: if name == "": continue print(f"Name: {name}")
この例では、空文字("")の場合に continue
でスキップしています。
不要な要素に対して余計な処理をしなくて済むため、処理が簡潔にまとまっています。
whileループとcontinue
続いて、while文 における continue
の使い方を確認していきましょう。
while文は、「条件が真の間は繰り返す」という仕組みです。
途中で特定の条件に当てはまったときに処理をスキップして、次の繰り返しに移りたい場合にも continue
が活躍します。
例1: 値が特定の範囲にない場合はやり直し
ユーザーから入力を受け取る際に、一定の範囲外の数値が入力されたら何度も入力を求めるという場面をイメージしてみます。
count = 0 while count < 5: num_str = input("0〜10の間の数字を入力してください: ") # 入力が数値かどうか簡単にチェック if not num_str.isdigit(): print("数値を入力してください。") continue num = int(num_str) if num < 0 or num > 10: print("範囲外の数値です。") continue print(f"{num} を入力しました。") count += 1
上のコードでは、ユーザーが文字列や範囲外の値を入力した場合、continue
を使って次のループに進んでいます。
こうすることで、無効な入力については残りの処理を行わず再度入力を求めることができます。
例2: 途中で状態が変わる場合
while文を使ったループの途中で、何らかの状態が変化することがあります。
このとき、状態が特定の値に一致したらすぐに次の反復へ移りたい場合にも continue
は有効です。
たとえば下記のような例を考えます。
counter = 0 limit = 10 while counter < limit: counter += 1 if counter == 5: # 特定のカウンタ値(5)のときだけスキップ continue print(counter)
ここでは、counterが5になったときだけ表示をスキップし、それ以外の値は表示しています。
if文と組み合わせる使い方
先述のとおり、continue文は if文 と組み合わせて使うことがほとんどです。
「ある条件式が真の場合に、あるブロック内の処理を飛ばして次の反復へ移る」というロジックを実装するために、if文で条件を判定して continue
を呼び出すのが一般的です。
もしif文を使わずに continue
を書いてしまうと、コードの意図が分かりづらくなります。
たとえば「どういう条件で処理をスキップしているのか?」という疑問が生まれやすくなります。
そのため、continue
の直前に分岐条件を明確に書くことで、読み手がスムーズに意図を把握できるようにしましょう。
コード例:if文とcontinueの簡単な組み合わせ
list_data = ["apple", "banana", "", "cherry"] for fruit in list_data: # 空文字を見つけたらスキップ if fruit == "": continue print(fruit)
このようにif文で条件をチェックしてから continue
を呼び出す書き方が、もっともオーソドックスなパターンです。
ネストしたループとcontinue
Pythonでネストしたループ(ループの中にさらに別のループがある状態)を組むことがあります。
この場合、continue
は 内側のループ に対してのみ有効になるので注意が必要です。
例1: 多重ループ内で特定要素をスキップ
例えば、二次元配列のようにリストのリストを扱う状況を想定します。
matrix = [ [1, 2, 3], [4, -1, 6], [7, 8, 9] ] for row in matrix: for value in row: if value < 0: # 内側のループでスキップ continue print(value)
上の例では、value < 0
となる値が見つかった場合に continue
が実行されますが、これは 内側のforループ をスキップする働きしか持ちません。
外側のループには影響せず、次の内側ループの反復へと進みます。
もし外側のループそのものをスキップしたい場合は、ロジックを変えるか条件分岐を工夫する必要があります。
例2: 複雑なスキップ条件
多重ループでは、外側の状態と内側の状態を組み合わせてスキップ条件を決定することがあります。 しかし、その条件が複雑になると可読性を損ないがちです。 以下はあくまでイメージ例ですが、外側ループと内側ループの両方の値を見てスキップを判定する可能性があります。
outer_list = [1, 2, 3] inner_list = ["A", "B", "C"] for o in outer_list: for i in inner_list: # 例として oが2かつ iが"B"ならスキップ if o == 2 and i == "B": continue print(f"o={o}, i={i}")
このように複数条件が混ざり合う場合、どの段階でスキップさせたいのかを整理しておかないと意図せず処理が行われる場合があります。 ネストの深さが増すほど混乱しやすくなるので、可読性を意識することが大切です。
break文との違い
繰り返し処理を途中で変化させるキーワードとして、break文 があります。
continue
と break
はどちらも制御フローを変えるものですが、その目的ははっきり異なります。
- break:ループ自体を終了させる
- continue:そのイテレーションの残りの処理をスキップし、次の反復へ移る
比較例
以下のコードは、break
と continue
を同時に使った例です。
for num in range(1, 11): if num == 3: continue if num == 8: break print(num)
ここでは、num
が 3 のときは処理をスキップして次の反復に移り、num
が 8 のときにループを抜けています。
したがって、出力されるのは 1, 2, 4, 5, 6, 7 までです。
num == 3
のタイミングでcontinue
⇒ 3は表示されないnum == 8
のタイミングでbreak
⇒ 以降の数字(9, 10)は表示されない
こうして2つの文を比較すると、それぞれが全く違うタイミングで働くことが分かります。
実務での活用例1: 不要なデータをスキップ
実務では、大量のデータを扱うシーンが少なくありません。 CSVファイルやAPIから取得したリストの中には、不要なデータや破損した値が含まれることもしばしばです。
ケース:センサーデータから無効な値を除外
センサーデータを受け取るコードを例に考えてみます。 センサーデバイスから測定値が送られてくるものの、一部の値がエラーで -999 のような異常値になっていたとしましょう。
sensor_values = [0.5, 0.6, -999, 0.7, 0.65, -999, 0.8] valid_values = [] for val in sensor_values: if val == -999: # 異常値なのでスキップ continue valid_values.append(val) print(valid_values)
このコードでは、-999 という異常値を検知したらスキップしています。
結果的に valid_values
には正常値のみが蓄積されるので、後続の分析処理や計算処理が扱いやすくなります。
このように、無効データを効率よく除外したいときに continue
は役立ちます。
実務での活用例2: ユーザー入力時のバリデーション
プログラムを作るうえでユーザーから何らかの入力を受け取る場面は多いものです。 しかし、ユーザー入力のすべてが有効とは限りません。
ケース:複数項目のバリデーション
フォーム入力を想定して、複数の値がまとめて送られてきた場合を例に挙げます。 たとえば、名前、年齢、メールアドレスなどの項目があるとき、一部に明らかなエラーがあれば特定項目の処理だけスキップしたいときがあります。
user_data_list = [ {"name": "Alice", "age": 20, "email": "alice@example.com"}, {"name": "Bob", "age": -5, "email": "bob@example.com"}, # 年齢が不正 {"name": "Charlie", "age": 25, "email": ""}, {"name": "", "age": 30, "email": "dave@example.com"} # 名前が空 ] valid_users = [] for user in user_data_list: # 年齢が0より小さいならスキップ if user["age"] < 0: continue # 名前が空ならスキップ if user["name"] == "": continue # メールアドレスが空ならスキップ if user["email"] == "": continue valid_users.append(user) print(valid_users)
ここでは、年齢や名前、メールアドレスのチェック条件を順番に書いて、どれか1つでも不正があれば continue
で次のユーザーに処理を移す仕組みを作っています。
実際にはもっと複雑なチェックを行うかもしれませんが、ひとまず簡素な例でも continue
が有効なことが分かるかと思います。
実務での活用例3: ファイル処理やログ解析
実務ではファイル処理やログ解析をすることも多いです。 ログファイルには、時にはエラー行やコメント行など不要なデータが混在することがあります。
ケース:コメント行や空行をスキップ
下記のように、ログファイルの各行をリストに読み込んで解析する想定をしてみます。
log_lines = [ "# This is a comment line", "2025-02-16 10:00:00 INFO Starting service", "", "2025-02-16 10:05:00 ERROR Something happened", "# Another comment", "2025-02-16 10:10:00 INFO Service running" ] for line in log_lines: # 空行や # で始まる行(コメント行)はスキップ if line.strip() == "" or line.strip().startswith("#"): continue print(f"Processing log: {line}")
ここでは、空行やコメント行は解析対象として不要なので、continue
でスキップしています。
実務ではログ内容をさらにパースしてレポートを作成するなどの処理を行うはずですが、まず不要行を除外するだけでもコードの見通しが良くなります。
デバッグやトラブルシュートでの活用シーン
大規模なプログラムを作ると、デバッグや不具合対応でコードを読みやすくしたいケースがたくさん出てきます。
そのようなときに、一時的に continue
を使って特定の条件を避けるコードを追加すると、必要な部分にフォーカスしやすくなります。
例:一時的な除外
デバッグ中に「特定のIDを持つデータは処理が重くなるから、とりあえずスキップしたい」という要望があるかもしれません。
こうした場合、該当IDだけを条件に continue
を挿入すれば、残りの処理に集中できます。
user_ids = [1001, 1002, 9999, 1003] for uid in user_ids: if uid == 9999: # デバッグのために仮でスキップ continue print(f"Processing user_id: {uid}")
本番コードに入れる前に迅速に確認や検証を行うための一時措置として、こうした使い方をすることもあります。 もちろん、デバッグが終わったら元のロジックに戻すのを忘れないように注意しましょう。
よくある疑問と対処法
ここでは、初心者の方が continue
を使う際に持ちやすい疑問について取り上げます。
疑問1: continueと条件分岐(if)だけで同じことを実現できない?
たとえば「continue
を使わなくても if文で処理を分けて書けばスキップと似た動きができるのでは?」と疑問に思う方もいるかもしれません。
しかし、continue
があることで、条件を満たしたら その後の処理をすべて飛ばして次の反復へ移る という意図が明確になります。
if文だけで同様の結果を得るには、ifの内側で残りの処理をすべてラップして書かないといけなくなり、ネストが増える可能性があります。
疑問2: breakとcontinueの使い分けが混乱する
break
はループ自体を終了する、continue
は部分スキップでループを続ける、という違いを改めて意識してください。
もし途中で完全にループから抜けたいなら break
、特定条件だけスキップしてループを続けたいなら continue
です。
疑問3: return文との違いは何?
関数定義の中で return
を呼ぶと、その関数自体の処理が終了してしまいます。
continue
はあくまで 現在の繰り返し処理の残り部分 をスキップするだけで、関数全体を終了させるわけではありません。
その点が大きく異なるポイントです。
continue文を使うときの注意点
便利な continue
ですが、使い方を誤るとコードが読みにくくなったり、意図しない動作をしてしまったりする可能性があります。
いくつかの注意点を押さえておきましょう。
注意点1: 過度なネスト
ネストしたループや複雑なif文の中で何度も continue
を使うと、どのタイミングでスキップされるのか追うのが大変になります。
可読性の維持に配慮しつつ、ロジックの分割や関数化などを検討すると良いでしょう。
注意点2: ループ外への影響を期待しない
先ほども触れたとおり、continue
は一番近いループブロックに対してのみ適用されます。
外側のループに影響を与えたい場合や、関数全体を終了したい場合は別のキーワードや制御フローを使う必要があります。
注意点3: フローが飛びすぎてロジックが不透明になる
continue
は使い方によっては、コードがジャンプしすぎて読みにくくなる懸念があります。
例外的な処理パターンが多ければ多いほど、コードの追跡が複雑化しがちです。
あまりにも複雑なスキップ処理を行うなら、事前にデータをフィルタリングしてからループに入れるなど、ロジックの整理をする手もあります。
複雑になりがちな処理ほど、最初にリストやデータをフィルタしてからメインの処理をする方法が考えられます。
その場合は continue
を乱用せず、構造自体を整理できるか検討してみましょう。
パフォーマンスへの影響はあるのか?
プログラミング初心者の方には、continue
を使うと余計に処理が増えるのではないかという心配をする方もいるかもしれません。
結論から言えば、continue
自体が特別なパフォーマンスコストを大きく増やすわけではありません。
むしろ、不要な要素に対して余計な処理を行わずに済むので、結果的にパフォーマンスが向上するケースもあります。 ただし、ループ数や条件分岐が過剰に多いと全体のコードが複雑化してしまう点は注意が必要です。
大きなデータを扱うケース
大量の行数を含むファイルを読み込む、APIで取得した多数のレコードを処理する、といった状況では「やらなくて良い処理」を少しでも削ることが大事です。
continue
を使えば、早めにスキップして余分なロジックに突入しないようにできるため、結果的に処理時間の短縮が期待できます。
もちろん、すべてをcontinue
だけで賄うのではなく、データの事前フィルタリングや効率的なアルゴリズム設計が必要なことは言うまでもありません。
continueを使ったコードの可読性を保つためのポイント
最後に、実際に continue
を使って開発する際に、可読性や保守性を保つためのポイントをいくつか紹介します。
ポイント1: コメントを加える
continue
の前後は、状況によっては一瞬で意味を把握しにくい場所です。
どのような意図でスキップしているのかを 簡単なコメント で補足すると、後から読んだ人が混乱しにくくなります。
for item in items: # 特定の条件を満たすアイテムは処理不要なためスキップ if is_invalid(item): continue process(item)
このように、その意図を一言入れておくだけでも親切です。
ポイント2: ネストを深くしない
二重、三重のループで複数箇所に continue
が散らばると、バグの原因になりがちです。
ネストが深くなりすぎそうな場合は、あえてループを分割する、あるいはループの前段階でフィルタリングするなどの手段を検討してみると良いでしょう。
ポイント3: 事前に条件を整理する
continue
でスキップすべき条件が複数ある場合は、まとめて書くか関数化するなどして、可読性を向上させる方法を考えてみましょう。
def is_skip_condition(item): # ここでスキップ条件をすべてまとめて判定 if item == "" or item == "NA": return True return False for item in data: if is_skip_condition(item): continue print(item)
こうすると、is_skip_condition
関数を読めば何がスキップ対象なのかが一目瞭然になります。
複雑なスキップ条件は関数化しておくと、テストもしやすくなり保守性も高まります。
まとめ
ここまで、Pythonの continue文 について、基礎的な構文から実務での活用例、注意点や可読性のポイントなど幅広く解説してきました。
continue
は、ループ中のある時点で「残りの処理をスキップして、次の繰り返しへ移る」ためのキーワードbreak
との違いは「ループ自体を終了するか否か」という点にある- 実務ではデータのバリデーションや不要行のスキップ、ログ解析などで威力を発揮する
- ネストや複雑な条件が増えると混乱しやすいので、コメントや関数化などで可読性に配慮する
初心者の方にとっては、continue
はとてもシンプルなキーワードに見えるかもしれませんが、実務での使い方は意外と幅広いです。
不要なデータや特殊ケースをうまくスキップするためにも、しっかり理解しておくと良いでしょう。
プログラムを読み返したとき、「なぜここだけスキップしているのか?」が一目で分かるように書くのがポイントです。 そのための上手なコメントや関数設計もぜひ意識してみてください。