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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。