Pythonの基礎知識(基礎編)

【Pythonの基礎知識】繰り返し処理の深掘り(for, while)

Pythonのfor文とwhile文は、どちらも繰り返し処理に使われます。
でも「何となくforばかり使ってる」「whileの使い所が分からない」という人も多いのでは?
本記事では、構文の違いだけでなく、それぞれの最適な使い分け方・制御構造・注意点を深掘りし、
実務やアプリ開発で「繰り返し処理を正しく使える」レベルを目指します。

for文のバリエーションと使い方

Pythonのfor文は、単なる繰り返しだけでなく、リスト・辞書・タプル・集合などの「イテラブル」な構造と柔軟に連携できるのが特徴です。
このセクションでは、基本のrange文から実務的なzip・enumerate、さらには辞書や集合への応用まで幅広く解説します。

基本構文とrangeの使い方

まずはPythonで最も基本的なfor文の構文から確認します。
特にrange関数を使ったループは、指定回数の繰り返し処理で多用されます。

for i in range(5):
    print(i) # 0〜4まで出力

rangeの引数を変更することで、開始値・終了値・ステップも柔軟に指定できます。

for i in range(2, 10, 2):
    print(i) # 2, 4, 6, 8

enumerateとzipの使いどころ

Pythonのfor文では、インデックス付きで要素を取り出せるenumerate()や、複数のリストを並列に処理できるzip()が非常に便利です。

names = ["Alice", "Bob", "Charlie"]
for index, name in enumerate(names):
    print(f"{index}: {name}")

また、複数のリストを同時に扱う場合にはzipが効果的です。

scores = [85, 90, 78]
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

辞書や集合との組み合わせパターン

for文はリストだけでなく、辞書(dict)や集合(set)とも連携できます。
構造に応じてループ対象を意識的に選ぶことが重要です。

# 辞書のキーと値を両方取得するパターン
person = {"name": "Alice", "age": 30}
for key, value in person.items():
    print(f"{key}: {value}")

# 集合を使った繰り返し(順序保証なし)
colors = {"red", "green", "blue"}
for color in colors:
    print(color)

辞書ではitems()メソッド、集合では順序に依存しない処理を行うのがポイントです。

while文との違いと適切な選び方

forとwhileは、いずれもPythonで繰り返し処理を行うための構文です。
ただし、その用途や使いどころには明確な違いがあります。
このセクションでは、while文の特性を軸に、「forでは書きにくい処理とは何か?」「無限ループとどう向き合うか?」という視点から深掘りしていきます。

while文の構文と基本動作

while文は、「条件がTrueの間だけ処理を繰り返す」構文です。回数が決まっていない処理や、ユーザー入力を待ち続けるような場面で活躍します。

count = 0
while count < 5:
    print(count)
    count += 1

if文と似た構文で条件式を書き、Trueである限り中の処理を繰り返します。条件がFalseになると、ループは終了します。

無限ループとの関係と活用シーン

while文は条件式の書き方によっては「無限ループ」になります。
処理を止めたい条件が正しく書かれていなければ、延々とループが回り続けるため注意が必要です。

while True:
    command = input("コマンドを入力してください: ")
    if command == "exit":
        break

このように、ユーザー入力を受け付け続ける待機処理では、あえて無限ループを活用することもあります。
break文と併用することで、制御可能な無限ループになります。

for文では書けない処理のパターン

for文はイテラブルなオブジェクト(リストや文字列など)に対して使う構文であり、繰り返しの「回数」が事前に決まっている処理に強いです。
一方、while文は「状態が変化するまで処理を繰り返す」ようなパターンに適しています。

password = ""
while password != "secret":
    password = input("パスワードを入力: ")
print("認証成功")

このように、終了条件が入力や外部状態に依存する場合は、for文よりもwhile文の方が自然です。
どちらを使うかは、「何をもって繰り返しを終えるか?」に応じて選ぶのが正解です。

breakとcontinueの正しい使い方

Pythonの繰り返し処理では、「どこで止めるか」「どこをスキップするか」という制御が重要です。
そのために使うのが breakcontinue。ただし、これらは誤用するとロジックが崩れたり、可読性を大きく損なう要因にもなります。
このセクションでは、break・continue・elseの意味と正しい使い方を押さえておきましょう。

breakでループを中断する

break は、ループの途中で強制的に処理を抜けたいときに使用します。
典型的なのは、「条件を満たした時点で処理を終了させたい場合」です。

for num in range(10):
    if num == 5:
        break
    print(num)

この例では、numが5になった時点でループが終了するため、出力されるのは 0〜4 になります。

continueでスキップする

continue は、現在のループだけスキップして、次の繰り返しに進みたいときに使用します。
たとえば、特定の条件だけ処理を「飛ばしたい」ときに便利です。

for i in range(5):
    if i == 2:
        continue
    print(i)

この場合、iが2のときだけprintがスキップされるため、出力は 0, 1, 3, 4 になります。

else節の意外な使い道

Pythonのループには、実は else節 をつけることができます。
これは「ループが break で中断されなかった場合」にだけ実行されるブロックです。

for num in range(5):
    if num == 10:
        break
else:
    print("ループは break されませんでした")

このように、正常にすべてのループが完了したかどうかを判定するのに便利な構文です。
ただし、Python特有の文法であるため、チーム開発では使い方に注意が必要です。

無限ループ・ネスト構造の注意点

Pythonに限らず、繰り返し処理では「抜けられないループ」と「見通しが悪くなる入れ子構造」がトラブルの原因となります。
この章では、無限ループの発生パターンと、ネスト地獄による可読性低下を防ぐための設計ポイントを整理します。

無限ループが発生する典型例

Pythonではwhileループの条件が常にTrueのままになると、無限ループが発生します。
特に、変数の更新忘れやbreak文の入れ忘れが原因になることが多いです。

count = 0
while count < 5:
    print("ループ中")
    # count += 1 を忘れている!

このようなコードではcountが永遠に0のままなので、条件がずっとTrueになり、処理が止まりません。
原因は単純ですが、気づきにくいため実行前に「終了条件」が正しく進むかどうかを意識しましょう。

ネストしすぎによる可読性低下

繰り返し処理の中に条件分岐が入り、さらにその中で別のループがある……といったネスト構造は、処理が複雑になる原因です。
ネストは2〜3階層までを目安にし、処理の分離や関数化で分割しましょう。

for user in users:
    if user["active"]:
        for item in user["items"]:
            if item["price"] > 1000:
                print("高額商品")

こうした構造は、処理の流れが非常に読みにくくなります。
一部でも関数化して切り出すことで、見通しの良いコードに改善できます。

ループ構造の整理と変数の扱い方

繰り返し処理では、「どこで何をカウントしているのか」が不明確になるとバグの温床になります。
特に複数のインデックス変数やフラグを扱うときは、変数の役割を明確にしておくことが重要です。

for i, item in enumerate(items):
    if i > 10:
        break
    if item == "skip":
        continue
    print(f"{i}: {item}")

このように、インデックス変数やループ制御の意図が明確であれば、ネストや複雑な構造も読みやすくなります。
逆に、何を制御しているかが曖昧なループは、保守性を大きく損なう原因になります。

実例:入力が「end」になるまで繰り返す

この章では、ここまで学んだ for・while・break の理解を実例で確認していきます。
「ユーザーが『end』と入力するまで処理を繰り返す」という、よくある基本操作を通して、Pythonの繰り返し処理を定着させましょう。

whileでユーザー入力を監視

まずは while文 を使って、ユーザーが「end」と入力するまでメッセージを表示し続けるシンプルな例です。

command = ""
while command != "end":
    command = input("コマンドを入力してください(endで終了): ")
    print(f"入力内容:{command}")

このコードは、ユーザーの入力内容を毎回表示します。
「end」と入力されるまでループは続き、それ以降は終了します。

break条件を含めたループ設計

次は 無限ループとbreak文 を使った設計です。こちらの方が「ループ条件」と「終了条件」を分けやすく、意図が明確になります。

while True:
    command = input("コマンドを入力してください(endで終了): ")
    if command == "end":
        break
    print(f"入力内容:{command}")

このように while True を使えば、「ループ自体は常に動き続ける」が、「条件を満たしたら明示的にbreakで抜ける」構造を作れます。
複雑な条件分岐や複数の終了トリガーを使いたい場合には、こちらの方法が推奨されます。

よくあるバグと安全な実装パターン

初心者によくある失敗が「printやbreakがループ外に出てしまう」ケースです。
インデントがズレていると、意図しないタイミングで出力が走ったり、無限ループに陥ったりします。

# 誤った例(breakがループ外)
while True:
    command = input("コマンドを入力: ")
if command == "end":
    break

この場合、if文とbreakがループの外にあるため、breakが実行されません
見た目には合っていても、インデントの深さで動作が変わってしまう点に注意しましょう。

安全に実装するためには、以下のように インデントを正しく揃え、処理の所属ブロックを常に意識することが大切です。

while True:
    command = input("コマンドを入力: ")
    if command == "end":
        break
    print("継続中...")

まとめ|繰り返し処理の本質を理解する

Pythonにおける繰り返し処理は、単なる構文の暗記ではなく、「どの場面でどの手法を選ぶか」という判断力が求められます。
for文とwhile文、それぞれに得意な使いどころがあり、zipやenumerateといった補助機能を活用することで、コードはより簡潔で明瞭になります。

また、無限ループやネスト構造による可読性の低下は、初心者にとって大きな落とし穴です。
breakやcontinueを適切に使いこなすことで、意図した処理フローを保ちながら、安全で効率的な繰り返し処理が可能になります。

この記事を通じて、繰り返し処理の構文だけでなく、現場で使えるパターンや注意点まで一通り学べたはずです。
次回は「リスト・タプル・辞書・セットの使い分け」に進み、より高度なデータ操作の技術を身につけていきましょう。

この記事を読んだら、次は「【Pythonの基礎知識】Pythonコレクション型の正しい選び方」の使い方に進むのがおすすめです。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-Pythonの基礎知識(基礎編)