while でカウントダウンする
このレッスンで分かること
while 条件:は条件が真の間ブロックを繰り返す、終了条件と更新文がセットです- 更新文 (
i -= 1など) を忘れると無限ループ、初期化はwhileの外で行います- 最小例は
i = n; while i >= 0: result.append(i); i -= 1
while でカウントダウンする とは
while 文を使って n から 0 までのカウントダウン結果をリストとして返す。終了条件と更新文を正しく組み立てる感覚を養う。
while でカウントダウンする
ループには for の他に while 文があります。while 条件: と書き、条件 が真である間ブロックを繰り返し実行します。for が「集合の要素を順番に取り出す」イメージなのに対し、while は「ある状態を満たしている間ぐるぐる回し続ける」イメージです。本レッスンでは整数 n から 0 までを順に並べるカウントダウン処理を題材に、while の終了条件と更新文の組み立てを学びます。
while は終了条件を満たさなくなる瞬間が必ず来るように設計しないと、無限ループになります。
while 文の構造
while 文は次の 3 つの要素から成り立っています。
- 初期化 — ループに入る前に必要な変数を準備する
- 条件式 — ループを継続するかどうかを判定する
- 更新文 — 条件式に使う変数の値を変える
Python
i = 5
while i >= 0:
print(i)
i -= 1
# 5, 4, 3, 2, 1, 0 が表示される上のコードは i を 5 で初期化し、i >= 0 の間ブロックを実行し、最後に i -= 1 で値を 1 減らしています。これがカウントダウンの基本パターンです。i -= 1 を書き忘れると、i がずっと 5 のままで i >= 0 が永遠に真になり、いわゆる 無限ループ になってしまいます。
for で書ける処理は while でも書けますが、回数が決まっているときは for の方が自然です。
リストに値を貯める
カウントダウンの結果をその場で print するだけでなく、リストに溜めて返す形にもよく書きます。空のリスト [] を初期化し、ループの中で append を呼ぶパターンを覚えておくと便利です。
Python
def countdown(n):
result = []
i = n
while i >= 0:
result.append(i)
i -= 1
return resultこの関数は n = 3 のとき [3, 2, 1, 0] を返します。result.append(i) で i の現在値をリストの末尾に追加し、i -= 1 で次の値に進めます。while の終了条件は i >= 0 なので、i = 0 のときも append が実行され、i = -1 になった瞬間にループを抜けます。
while の条件は「次の反復に入る前」に毎回評価されます。
動きを追ってみる
n = 3 のときの状態遷移は次のとおりです。
n = 3 のときに i と result がどう変わるかを表にすると、次のとおりです。
| ループ回数 | 開始時の i | 条件 i >= 0 | append 後の result | 終了時の i |
|---|---|---|---|---|
| 1 | 3 | 真 | [3] | 2 |
| 2 | 2 | 真 | [3, 2] | 1 |
| 3 | 1 | 真 | [3, 2, 1] | 0 |
| 4 | 0 | 真 | [3, 2, 1, 0] | -1 |
| 5 | -1 | 偽 | — (return) | -1 |
ループに入る前に条件を満たしていない場合 (例えば n = -1) は、本体が 一度も実行されない 点も while の特徴です。
よくある間違い
while 文で陥りやすい失敗は次のとおりです。
- 更新文
i -= 1を書き忘れて無限ループになる - 条件を
i > 0と書き、0が結果に含まれない i = nの初期化を忘れてNameErrorになるresultの初期化をループの中に書いてしまい、毎回空に戻るreturn resultの位置を間違えて、リストが完成する前に返す
Python
# NG: i -= 1 が抜けているので無限ループ
i = n
while i >= 0:
result.append(i)このコードは絶対に止まりません。実行する前にコードを目で追って、「ループ変数が確実に終了条件に近づいているか」を確認するくせをつけましょう。while True: と break を組み合わせる書き方もありますが、まずは普通の条件式で書けるようになってからにしましょう。
無限ループに陥ったら Ctrl+C で止められます。実機で書くときは焦らず止めましょう。
for と while の使い分け
ループの 2 つの形を使い分ける指針を簡単にまとめます。for は「コレクションの要素を全部見るとき」や「回数があらかじめ決まっているとき」、while は「外部入力やセンサー値など、終わるタイミングが事前に決まらないとき」に向いています。本レッスンの題材は回数が決まっているので、本当は for i in range(n, -1, -1): でも書けます。あえて while で書くのは、while の挙動を自分の手で理解するためです。
| 状況 | for | while |
|---|---|---|
| 回数が事前に決まっている | 向いている | 書けるが冗長 |
| 終了タイミングが動的 (入力次第) | 苦手 | 向いている |
| イテラブルを舐めるだけ | 最適 | わざわざ index を持つ必要あり |
| センサー値や API の応答待ち | 不向き | 自然に書ける |
while を書きながら「いま i はいくつで、次に条件はどう変わるか」を頭の中で実行できるようになると、後の章で出てくる break や continue を組み合わせた処理もスムーズに理解できます。
ここまでの要点
while は「初期化 → 条件チェック → 本体 → 更新」を繰り返す。更新文を忘れると無限ループ。回数固定なら for、終了タイミングが動的なら while。
やってみよう
このレッスンでは、整数 n を受け取り、n から 0 までの整数を 降順に並べた リストを返す関数 countdown(n) を実装します。手順は次のとおりです。
- 空リスト
resultとi = nを準備する while i >= 0:の中でresult.append(i)とi -= 1を書く- ループを抜けたら
return result n = 0で[0]、n = -1で[]が返るか確認する
余裕があれば、
for i in range(n, -1, -1):と書いた場合と結果を比較してみてください。
よくある質問
Q. while で無限ループを止めるには?
A. ループ内で必ずカウンタを更新するか、break で抜ける条件を書きます。たとえば i = 0; while i < 10: i += 1 のように i += 1 を忘れると永久に止まりません。Ctrl+C で強制終了できますが、デバッグ時はループの 1 周目で print(i) を入れて挙動を確認すると原因が見えます。
Q. while と for はどう違いますか?
A. 繰り返し回数が決まっていれば for、終了条件が動的なら while が向いています。リスト走査や range は for で書く方が安全で、ユーザー入力が来るまで・センサー値が閾値を超えるまで、のようなケースは while True + break が定石です。
Q. do-while のように最低 1 回は実行したい場合は?
A. Python には do-while がないため、while True: ... if cond: break のパターンで再現します。JavaScript なら do { ... } while (cond) と書けます。「最初の 1 回は条件を見ずに走らせる」処理(入力受付など)で有効です。
次のレッスン
次は range の step で等差数列を作る で、while 文を使って n から 0 までのカウントダウン結果をリストとして返す を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- while カウントダウン の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. while カウントダウン とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
要件
- while 文を使って実装すること
- 空リスト result を初期化し append で値を追加すること
- 戻り値は print ではなく return で返すこと
入出力例
test-cases.txt
countdown(3) → [3,2,1,0]
countdown(0) → [0]
countdown(-1) → []
countdown(5) → [5,4,3,2,1,0]
countdown(1) → [1,0]