Pythonのwhileループ、プログラミング学習中の皆さん、使いこなせていますか?
この記事では、そんなPythonのwhileループの基本から、ちょっと応用的な使い方、そしてみんなが気になる無限ループを避けるコツまで、まるっと解説していきます。もうwhileループなんて怖くない!って思えるようになるはず。
この記事で学べること
- whileループの基本的な仕組みと書き方がわかる
- どんな時にwhileループを使うと便利なのかがわかる
- 無限ループにサヨナラ!その原因と対策がわかる
- break文やcontinue文でループを自在に操れるようになる
- 実践的なコード例で、whileループの使いどころがイメージできる
Pythonのwhile文とは?繰り返し処理の基本を学ぼう
まず、whileループって何ぞや?ってところから始めましょう。
簡単に言うと、whileループは「ある条件が満たされている間(Trueの間)、特定の処理をずーっと繰り返す」ための命令です。
例えば、自動ドアを想像してみてください。「人がドアの前にいる」という条件が満たされている間は「ドアを開け続ける」という処理を繰り返しますよね。人がいなくなったら(条件が満たされなくなったら)、ドアを閉める。これがwhileループの基本的な考え方です。
Pythonにはもう一つ、forループという繰り返し処理もありますが、こちらは「リストの全要素に対して処理する」みたいに、繰り返す回数や範囲があらかじめ決まっている場合に得意です。
一方、whileループは「いつ終わるか分からないけど、特定の条件になるまで繰り返したい」という場面で大活躍しますよ!
while文の基本的な書き方と構文ルール
さて、いよいよwhileループの書き方を見ていきましょう。構文は意外とシンプルですよ!
while 条件式:
# 条件式がTrueの間、繰り返される処理
処理1
処理2
# ループを終わらせるために、条件式に関わる変数を変化させる処理も忘れずに!
ポイントは以下の通りです。
whileというキーワードの後に、繰り返すかどうかを判断するための条件式を書きます。- 条件式の最後にはコロン(:)を忘れずにつけましょう。
- 次の行から、繰り返したい処理をインデント(字下げ)して書きます。このインデントされた部分が、whileループの処理ブロックです。Pythonではインデントが超大事!
- 条件式がTrueの間、インデントされた処理が上から順に実行され、ブロックの最後まで行くと、また条件式の判定に戻ります。
- 条件式がFalseになった時点で、ループは終了し、ループブロックの次の処理に進みます。
イメージするとこんな感じです。
while (条件がTrueの間): ▶ ---- ここからインデント ---- | 繰り返したい処理1 | | 繰り返したい処理2 | ---- ここまでインデント ---- <--- 処理が終わったら、また条件のチェックに戻る | V (条件がFalseになったら) 次の処理へ
インデントを揃えることと、いつか条件式がFalseになるようにすること、この2点をしっかり押さえておきましょう!
サンプルプログラムと実行結果
百聞は一見にしかず!簡単なサンプルコードを見てみましょう。
1から5までの数字を表示するプログラムです。
# カウンター変数を初期化
count = 1
# countが5以下の間、ループを続ける
while count <= 5:
print(count) # countの値を表示
count = count + 1 # countを1増やす(これを忘れると無限ループ!)
print("ループ終了!")
これを実行すると、コンソールにはこう表示されます。
1 2 3 4 5 ループ終了!
まずcountに1が設定されます。while count <= 5: の条件式はTrueなので、ループ内の処理が実行されます。print(count)で1が表示され、count = count + 1でcountが2になります。
そしてまた条件式に戻り、count (今は2) は5以下なのでTrue。2が表示され、countが3に…という流れを繰り返し、countが6になった時点で count <= 5 がFalseとなり、ループが終了して「ループ終了!」が表示されるわけです。
ループ内で条件に関わる変数を変更する処理(ここではcount = count + 1)が非常に大事だとわかりますね!
while文で無限ループを防ぐ確実な方法
さあ、やってきました!みんな大好き(?)無限ループのお話です。
無限ループとは、その名の通り、ループが永遠に終わらなくなってしまう状態のこと。プログラムが固まって応答しなくなったり、CPUを使い切ってしまったり、なかなか厄介なやつです。
なぜ無限ループが起きるのか?主な原因は2つ。
- 条件式が常にTrueになってしまう
例えばwhile True:と書くと、条件は常に真なので、意図的にループを抜ける処理(後述するbreak)がない限り止まりません。 - ループ内で条件式の判定に使われる変数を変更し忘れる
さっきのカウンターの例でcount = count + 1を書き忘れると、countはずっと1のまま。count <= 5は永遠にTrueなので、無限に1が表示され続けます。これが一番やりがちなミス!
無限ループを防ぐには、
- ループを抜ける条件をちゃんと設定する
- ループ内で、その条件に関わる変数がちゃんと変化するように処理を書く
この2つを常に意識しましょう!
もし、うっかり無限ループを実行しちゃったら…慌てずに!
大抵の実行環境では、キーボードのCtrlキーを押しながらCキーを押す(Ctrl+C)ことで、プログラムを強制終了できます。覚えておくと安心ですよ。
whileループを途中で抜けるbreak文の使い方
whileループは条件式がFalseになるまで繰り返しますが、「ループの途中だけど、もうこの処理はやめたい!」という時もありますよね。
そんな時に使うのがbreak文です。
break文が実行されると、ループの条件式がどうであれ、その時点で即座にループ全体が終了します。ループブロックから強制的に脱出するイメージです。
よく使うのは、if文と組み合わせて、「特定の条件になったらループを抜ける」というパターンです。
# 何か入力されるのを待ち続ける
while True: # まず無限ループにしておく
user_input = input("何か入力してください ('quit'で終了): ")
if user_input == 'quit':
print("終了します。")
break # 'quit'と入力されたらループを抜ける!
print(f"入力されたのは「{user_input}」ですね。")
print("ループの外に出ました。")
この例では、ユーザーが「quit」と入力するまで、延々と入力を促し続けます。「quit」が入力された瞬間にif文の中に入り、breakが実行されてwhileループが終了する、という流れです。
breakはループ自体を終わらせる、と覚えておきましょう。
whileループで処理をスキップするcontinue文の使い方
breakがループ自体を終わらせるのに対して、「今回はループの残りの処理を飛ばして、次の回のループ(条件判定)に進みたい」という時に使うのがcontinue文です。
continue文が実行されると、その回のループブロック内でcontinueよりも下にある処理はすべてスキップされ、すぐに次のループの条件判定に戻ります。
例えば、1から10までの数字のうち、偶数だけを表示したい場合、こんな風に書けます。
num = 0
while num < 10:
num = num + 1
# numが奇数だったら、printせずに次のループへ
if num % 2 != 0: # % は余りを計算する演算子
continue # ここで下のprintは実行されず、whileの条件判定に戻る
print(num) # 偶数の場合だけ表示される
print("偶数だけ表示完了!")
実行結果:
2 4 6 8 10 偶数だけ表示完了!
numが1, 3, 5, 7, 9 のときはif num % 2 != 0:がTrueになり、continueが実行されます。すると、その下にあるprint(num)は実行されずに、すぐにwhile num < 10:の判定に戻るのです。
continueは現在の回の処理だけをスキップする、と理解しておきましょう。
while文とelse文を組み合わせる応用テクニック
ちょっと面白い機能として、Pythonのwhileループにはelseブロックを付けることができます。
これは、if文のelseとは少し意味合いが違います。
whileループのelseブロックは、ループがbreak文で中断されずに、条件式がFalseになって正常に終了した場合にのみ実行されます。
どういう時に使うかというと、「ループが無事に最後まで終わったことを確認したい」場合などに便利です。
count = 0
while count < 3:
print(f"ループ実行中: count = {count}")
count += 1
# ここでbreakする条件を入れてみる(例: countが2になったらbreak)
# if count == 2:
# print("途中でbreakします!")
# break
else:
# このブロックは、ループがbreakされずに正常終了した場合だけ実行される
print("ループが正常に終了しました!")
print("プログラム終了")
上記のコード(breakの部分がコメントアウトされている状態)を実行すると、以下のようになります。
ループ実行中: count = 0 ループ実行中: count = 1 ループ実行中: count = 2 ループが正常に終了しました! プログラム終了
ループが3回実行され、countが3になった時点でcount < 3がFalseになり、正常にループが終了したので、elseブロック内のメッセージが表示されました。
もし、if count == 2:の行とbreakの行のコメントを外して実行すると、countが2になった時点でbreakが実行され、ループが途中で終わるため、elseブロックは実行されません。
ループ実行中: count = 0 ループ実行中: count = 1 途中でbreakします! プログラム終了
このように、ループが最後まで完走したか、途中で脱出したかを判別したいときに、while-else構文は役立ちます。
while文の実践的な使い方
理屈はわかったけど、実際にどう使うの?という声が聞こえてきそうですね。
ここでは、もう少し実践的なwhileループのサンプルコードをいくつか見てみましょう!
例1 簡単な数当てゲーム
import random
# 1から10までのランダムな数を生成
answer = random.randint(1, 10)
guess = 0 # ユーザーの予想値を初期化
print("数当てゲーム! 1から10の数を当ててね。")
while guess != answer:
try:
guess = int(input("予想する数を入力: "))
if guess < answer:
print("もっと大きいよ!")
elif guess > answer:
print("もっと小さいよ!")
except ValueError:
print("ちゃんと数字を入力してね!")
# ループを抜けたら正解!
print(f"正解!答えは {answer} でした!")
このコードでは、ユーザーが正解の数字(answer)を入力するまで、while guess != answer:のループが続きます。
入力された値(guess)がanswerと等しくなった時点で条件がFalseになり、ループが終了して正解メッセージが表示される仕組みです。ユーザーの入力によって繰り返し回数が変わる典型的な例ですね。
例2 'quit'と入力されるまで対話
print("こんにちは!何か話しかけてください。 ('quit'で終了)")
while True: # まずは無限ループ
message = input("> ")
if message == 'quit':
print("さようなら!")
break # quitでループを抜ける
elif 'こんにちは' in message:
print("こんにちは!元気?")
elif '疲れた' in message:
print("お疲れ様!ゆっくり休んでね。")
else:
print("ふむふむ、なるほど。")
これはbreakの例でも見たパターンですが、ユーザーが「quit」と入力するまで対話を続けます。入力内容に応じて簡単な返事を返すようにしています。終了条件が明確な場合にwhile True:とbreakを組み合わせるのはよくある手法です。
while文で初心者が陥りやすい注意点
whileループは便利ですが、初心者がつまづきやすいポイントもいくつかあります。無限ループ以外にも、こんな点に注意しましょう!
- 条件式のミス
等しいかどうかを比較したいのに、代入の=を1つだけ書いてしまう(while count = 5:など)。比較は==を使うのがお約束です!大なり小なりの向き(<と>)を間違えることもあります。 - カウンター変数の更新忘れ
無限ループの項目でも触れましたが、これは本当に多いミスです!ループ内で条件に関わる変数をちゃんと変更しているか、必ず確認しましょう。 - インデントの誤り
Pythonではインデントがブロックを示すので、インデントがずれていると、ループに含めたい処理がループの外にあるとみなされたり、逆にループに含めたくない処理がループ内に入ってしまったりします。エラーの原因にもなるので、インデントは正確に! - ループ変数のスコープ
ループの中で定義した変数は、基本的にはループの外では使えません(場合によりますが)。ループの外で使いたい値は、ループの前に変数を定義しておきましょう。
もし、whileループが思った通りに動かなかったら?
まずはprint()文を使ったデバッグを試してみましょう!ループの前後やループの中で、変数の値がどうなっているかprint()で表示させてみるのです。
count = 1
while count <= 5:
print(f"ループ開始時のcount: {count}") # ★デバッグ用に追加
# 何か処理...
print(count)
count = count + 1
print(f"ループ終了時のcount: {count}") # ★デバッグ用に追加
print("ループ終了!")
こうすることで、変数が意図した通りに変化しているか、条件判定が正しく行われているかなどを追跡できます。地道ですが、これが一番確実なデバッグ方法の一つですよ!
Pythonのwhile文の学習まとめ
これでPythonのwhileループの基本から応用、注意点まで一通り理解できたはずです!
今回学んだポイントを振り返ってみましょう。
- whileループは条件がTrueの間、処理を繰り返す
- 繰り返す回数が決まっていない時に特に便利
- 構文は
while 条件式:とインデントが肝心 - 無限ループを避けるには、条件式の見直しとループ内での変数更新が必須!
breakでループを強制終了、continueで現在の回をスキップelseブロックはループが正常終了した時に実行される
forループとwhileループ、どちらを使うか迷うこともあるかもしれませんが、「回数が決まっているならfor、条件次第ならwhile」と大まかに覚えておくと良いでしょう。
【関連記事】 「Pythonとは?」に答える最初の一歩


0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。