while でカウントダウンする

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

このレッスンで分かること

  • 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 が表示される

上のコードは i5 で初期化し、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 のときの状態遷移は次のとおりです。

diagram (will load when visible)

n = 3 のときに iresult がどう変わるかを表にすると、次のとおりです。

ループ回数開始時の i条件 i >= 0append 後の result終了時の i
13[3]2
22[3, 2]1
31[3, 2, 1]0
40[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 の挙動を自分の手で理解するためです。

状況forwhile
回数が事前に決まっている向いている書けるが冗長
終了タイミングが動的 (入力次第)苦手向いている
イテラブルを舐めるだけ最適わざわざ index を持つ必要あり
センサー値や API の応答待ち不向き自然に書ける

while を書きながら「いま i はいくつで、次に条件はどう変わるか」を頭の中で実行できるようになると、後の章で出てくる breakcontinue を組み合わせた処理もスムーズに理解できます。

この章のポイント

ここまでの要点 while は「初期化 → 条件チェック → 本体 → 更新」を繰り返す。更新文を忘れると無限ループ。回数固定なら for、終了タイミングが動的なら while

やってみよう

このレッスンでは、整数 n を受け取り、n から 0 までの整数を 降順に並べた リストを返す関数 countdown(n) を実装します。手順は次のとおりです。

  1. 空リスト resulti = n を準備する
  2. while i >= 0: の中で result.append(i)i -= 1 を書く
  3. ループを抜けたら return result
  4. 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 つができることを確認しましょう。

  1. while カウントダウン の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. while カウントダウン とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. while 文を使って実装すること
  2. 空リスト result を初期化し append で値を追加すること
  3. 戻り値は 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]

ヒント

main.py
main.py
学習モード

メモ

while でカウントダウンする

⌘S で保存