whileループ — 条件が成り立つあいだ実行する
同じ作業を繰り返すこと、無限ループが起こる仕組みと止めかた、breakとcontinue、入力が有効になるまで聞き直すことを学びます。
どうやって学びますか?
解決する問題
前の章では、悪い入力を捕まえる方法を学びました。たとえば相手がtwentyと入力したら、プログラムは「数字ではありません」と言えます。
でも、そう言ったあとはどうなるでしょうか? プログラムは止まってしまいます。使う人はプログラム全体をもう一度実行しなければなりません。本当のソフトウェアは、そんな動きをしません。もう一度たずね、有効な答えが得られるまで、たずね続けます。
ループは、そのためにあります。必要なあいだ、同じ作業を何度でも繰り返すのです。今日はwhileを学びます。これは条件が真であるあいだ実行し続けるものです。
今日はもう1つ、新しい体験が待っています。テキストがターミナルを猛スピードで流れていく、止まらないプログラムです。怖がることはありません。この章の中で、止めかたも学びます。
この章を終える頃には
whileループを書き、いつ止まるかを説明できる- 無限ループが起こる理由を見分け、
Ctrl + Cで止められる - ループの中で合計や回数を積み上げられる
breakとcontinueを適切な場所で使える- 入力が有効になるまで聞き続けられる
前提条件: if、elif、elseで判断する。
いちばん簡単なループ
count = 3
while count > 0:
print(count)
count = count - 1
print("Go")3
2
1
Go形はifとよく似ています。条件、コロン、インデントされたブロックです。違いは1つだけですが、それがすべてです。ifは条件を1回だけ調べます。whileは、ブロックが終わるたびに条件をもう一度調べます。
上のプログラムの動きは次のとおりです。
countは3です。条件3 > 0は真なので、ブロックが実行され、3が表示されて、countは2になります- もう一度条件を調べます。
2 > 0は真なので、2が表示され、countは1になります - もう一度条件を調べます。
1 > 0は真なので、1が表示され、countは0になります - もう一度条件を調べます。
0 > 0は偽なので、ループは終わり、実行は次に進みます
動いているwhileループには、必ず3つの部分があります。3つすべてが必要です。
- 開始値 — ループの前に置く値(
count = 3) - 条件 — いつ繰り返すかを決める式(
count > 0) - 変化 — ループの中にあり、いつか条件を偽にする処理(
count = count - 1)
無限ループ
3つ目の部分が抜けると何が起こるのか、見ておく価値があります。
count = 3
while count > 0:
print(count)これは3を延々と表示し続けます。countは変わらないので、count > 0が偽になることはないからです。
止めかた: ターミナルでCtrl + Cを押します。 すぐに停止し、次のような表示が出ます。
Traceback (most recent call last):
File "D:\python-lab\lesson-10\loop.py", line 4, in <module>
print(count)
KeyboardInterruptFileの行には、ファイルのフルパスが表示されます。行番号は、キーを押したタイミングによって変わります。KeyboardInterruptは、自分で止めたことを意味します。これはコードのバグではなく、あなたの判断です。
無限ループは、学ぶ過程の一部です。 どんなプログラマーも一度は書いたことがあり、今でも書くことがあります。怖がる必要はありません。Ctrl + Cを知っていれば、ちょっとした面倒で済みます。ループを書くときは、一度だけ自分に問いかけてください。「この条件は、どうやって偽になるのか?」 答えられないなら、そのループは止まりません。値を積み上げる
ループの最もよくある仕事は、何かを積み上げることです。合計、回数、これまでに見た中で最大の値などがあります。
total = 0
number = 1
while number <= 5:
total = total + number
number = number + 1
print("Sum of 1 to 5:", total)Sum of 1 to 5: 15totalはアキュムレータ(値を集めていく入れ物)と呼ばれます。注目してほしいのは、0から始めて、ループの外に置いていることです。ループの中に置いてしまうと、毎回のくり返しでリセットされ、最後には最後の数字しか残らなくなってしまいます。
break — 今すぐ抜ける
breakは、条件が何と言っていても、ループを直ちに終わらせます。
number = 1
while number <= 100:
if number % 7 == 0:
print("First multiple of 7:", number)
break
number = number + 1First multiple of 7: 7条件は100まで続けるように言っていますが、7が現れた時点で仕事は終わっています。だから、あと93回も回る必要はありません。
breakによって、とても役立つ書きかたもできるようになります。条件にTrueを書き、適切な場所から抜けるやりかたです。
while True:
answer = input("Type 'quit' to exit: ").strip().lower()
if answer == "quit":
print("Goodbye")
break
print(f"You typed: {answer}")Type 'quit' to exit: hello
You typed: hello
Type 'quit' to exit: QUIT
Goodbyewhile Trueは「永遠に実行する」という意味なので、中のbreakは必ず必要です。ないと無限ループになります。
continue — この回をスキップする
continueはループを終わらせません。ブロックの残りを飛ばして、すぐ次の回に進みます。
number = 0
while number < 10:
number = number + 1
if number % 2 == 0:
continue
print(number)1
3
5
7
9偶数のたびにcontinueが実行されたので、そのときはprintが飛ばされました。
continueを書くときの落とし穴があります。 条件を前に進める行(number = number + 1)がcontinueの後ろにあると、continueがその行を飛ばしてしまいます。すると、ループはそこで止まったまま、永遠に抜け出せなくなります。だから上のコードでは、増やす処理を先に書いています。continueを使うときは、必ずこの順番を確認してください。
いよいよ: 入力が有効になるまで聞き続ける
2つの章にわたって待ってきたものが、ついに登場します。
while True:
raw = input("Your age: ").strip()
if raw.isdigit():
age = int(raw)
break
print("Please type a whole number, digits only.")
print(f"Thank you. Age recorded as {age}.")Your age: twenty
Please type a whole number, digits only.
Your age: 22.5
Please type a whole number, digits only.
Your age: 22
Thank you. Age recorded as 22.これは、仕事を続けるかぎりずっと使うことになるパターンです。永遠にループし、中で入力を検証し、良ければbreakで抜け、だめならメッセージを表示して次の回に進みます。プログラムは不正な入力でクラッシュしなくなり、使う人が最初からやり直す必要もなくなります。
完成例
shopping.py:
# Keep taking item prices until the user is done, then summarise
total = 0.0
item_count = 0
print("Enter item prices. Type 'done' to finish.")
while True:
entry = input("Price: ").strip().lower()
if entry == "done":
break
if entry == "":
print(" Nothing typed — try again.")
continue
# Accept only digits and at most one decimal point
if entry.replace(".", "", 1).isdigit():
price = float(entry)
total = total + price
item_count = item_count + 1
print(f" Added {price:.2f}. Running total {total:.2f}")
else:
print(f" '{entry}' is not a price. Try again.")
print()
if item_count == 0:
print("No items were entered.")
else:
average = total / item_count
print(f"Items : {item_count}")
print(f"Total : {total:.2f}")
print(f"Average : {average:.2f}")Enter item prices. Type 'done' to finish.
Price: 120
Added 120.00. Running total 120.00
Price: abc
'abc' is not a price. Try again.
Price: 85.5
Added 85.50. Running total 205.50
Price: done
Items : 2
Total : 205.50
Average : 102.75ここでは3つのことが一緒に働いています。どれも今日の学習内容です。
break— 相手がdoneと入力したとき、ループを抜けるcontinue— 残りを飛ばし、空の行では再び聞く- アキュムレータ —
totalとitem_countはどちらもループの外で始まり、中で増えていく
最後のif item_count == 0が必要な理由を考えてみましょう。値を1つも入力せずに、相手がdoneと入力すると、item_countは0になります。そのままtotal / item_countを実行すると、ZeroDivisionErrorでプログラムが止まってしまいます。ループで積み上げたものを使う前には、毎回こう問いかけてください。「何か1つでも積み上がったか?」
うまくいかないとき
プログラムが止まらず、テキストが流れ続ける Ctrl + Cを押してください。そのあと、ループの本体に条件を進める行があるか、そしてその行がcontinueの後ろにないかを確認しましょう。
ループがまったく実行されない 条件が最初から偽になっています。開始値と条件を比べてください。count = 0から始めたwhile count > 0は、一度も中に入りません。
1回多すぎる、または少なすぎる <と<=を取り違えています。n = 1から始めると、while n < 5は4回(nが1、2、3、4のとき)実行され、while n <= 5は5回実行されます。開始値を変えると回数も変わります。n = 0から始めると、while n < 5は5回実行されます。だから、開始値と条件は必ずセットで確認しましょう。
IndentationError: expected an indented block after 'while' statement whileの次の行がインデントされていません。
ループの後でNameError — 変数が未定義 その変数はループの中で作られただけです。ループが1回も実行されなかった場合、変数は作られていません。ループの後で使う変数には、ループの前に開始値を与えておきましょう。
ループの最後で合計が間違っている アキュムレータがループの中で初期化されていないか確認してください。total = 0の行は、ループの外になければなりません。
ステップ 4 / 6 — 予想する
理解度をチェック
このループは全体で何を表示しますか?
count = 3
while count > 0:
print(count)
count = count - 1
print("Go")- A2 1 0 Go
- B3 2 1 0 Go
- C3 Go
- D3 2 1 Go
このプログラムは止まりません。何が足りないのでしょうか?
total = 0
number = 1
while number <= 5:
total = total + number
print(total)- A`while`は`if`にすべきだ
- Bループの中に`number = number + 1`がないので、条件が偽になることはない
- C条件の`<=`を`<`に変えれば止まる
- D`total`がループの中で初期化されていない
このcontinueがある状態で、このループは何を表示しますか?
number = 0
while number < 5:
number = number + 1
if number == 3:
continue
print(number)- A1 2 4 5
- B1 2 3 4 5
- C1 2 4
- D1 2
回答にはアカウントが必要です
ログインして答えを確認
問題は上にあります。頭の中で答えを考えることがいちばん大切です。ログインすると、正解・解説・3 段階のヒントを確認できます。
やってみよう
guess.pyという数当てゲームを書いてください:
- 1から100までの間の秘密の数字を、コードの中で決めておく
- 相手に数字を予想してもらい、毎回「高い」か「低い」かを伝える
- 正解したら、お祝いの言葉を伝えて、ループを抜ける
- 何回で当てたかを表示する
- 数字ではないものを入力されてもプログラムが壊れないようにし、メッセージを表示してもう一度たずねる
- 7回試したらゲームを終え、秘密の数字を明かす
条件6が、いちばん考えさせられるところでしょう。このループは、2つの違う理由で終わるようになります。正解したときと、試行回数が尽きたときです。この2つの出口をどう配置するかが、この練習の本当の問題です。動いたら、もう一度自分のコードを読み直して、こう問いかけてください。このループが永遠に回り続けてしまうような状態になることは、ないか?
このミッションにはまだ続きがあります
上で読んだ内容がミッションのすべてで、削られた部分はありません。Pro では次の内容が追加されます:
- 内部で実際に何が起きているか — Python がこれをどう実行するのか
- 演習の完全な解答と、ステップごとの解説
- さらに難しい追加演習
- このテーマでよく聞かれる面接の質問と模範解答