Python速習ガイド - ステップ2 制御フロー (4) - ループ (2): while文
- 本講座は、Pythonプログラミングの基礎を手を動かしながら最速で身につけるための講座です。
- 「スタイルガイド」では、Pythonできれいなコードを書くためのガイドライン(PEP8)で紹介されている内容を主に記載しています。
- 各コードは実行して結果を確認することができます。
ページの再読み込みで元の内容に戻りますので、自由にいじってみてください。
「ステップ2 制御フロー」の続きです。
2.2. ループ
前回はfor
文によるループについて学習しました。今回は、もうひとつのループ構文であるwhile
文について学んでいきます。
2.2.2. while
文
while
文の基本
while
文は、指定した条件がTrue
である限り、繰り返し処理を実行するループ構文です。
while
文では、条件式がTrue
である限り、ループ内の処理が繰り返し実行されます- 条件式が
False
と評価されると、ループは終了し、次の処理に進みます
flowchart TD START[開始] --> INIT["counter = 5"] INIT --> WHILE{"while counter > 0"} WHILE -->|False| END["ループ終了"] WHILE -->|True| LOOP_BODY["ループ処理\n(... counter -= 1)"] LOOP_BODY --> WHILE linkStyle 2 stroke:red,stroke-width:2px; linkStyle 3 stroke:green,stroke-width:2px;
1から10までカウントアップするプログラムをwhile
文を用いて作成しましょう。
解答例
指定した整数を2で割り続けて奇数になったときの数値を出力しましょう。
解答例
整数を1から順に足していき合計が1000を超えたときの、最後に足した整数と合計値を表示しましょう。
解答例
ループ制御文
for
文と同様に、while
文でもbreak
とcontinue
を使うことができます。
break
: ループの中断
break
文を使うと、条件に関わらずループを即座に抜け出すことができます。
上記の例では、number
が5になった時点でbreak
文が実行され、ループを抜けます。そのため、6以降の数は処理されません。
無限ループ
条件が常にTrue
となるループを無限ループといいます。無限ループはbreak
文と組み合わせて使うことがあります。
while True
は条件が常にTrue
となるため、break
文で明示的に抜け出さない限り永遠に実行され続けます- カウンタの更新忘れなど、意図しない無限ループには気をつけましょう
input
関数を使用すると、ユーザからの入力を文字列として受け取り、変数に代入して利用できます。
本環境では、input
関数を実行するとブラウザのダイアログが表示されますが、通常の Python スクリプト(たとえば .py
ファイルをPC上で実行する場合)では、ターミナル上で入力を受け付ける形式になります。
スクリプトとしてプログラムを実行する方法については、後ほど詳しく解説します。
input
関数を使用してユーザの好きな野菜を繰り返し聞き、「exit」という文字列が入力されるまで、
「ユーザの好きな野菜: <好きな野菜>」のフォーマットで常に画面出力するプログラムを作成しましょう。
解答例
continue
: ループのスキップ
continue
文を使うと、現在の繰り返し処理の残りをスキップして、次の条件判定に進むことができます。
この例では、number
が偶数の場合はcontinue
文によって残りの処理(print(f"処理中: {number}")
)がスキップされ、次のループの条件判定に進みます。
1から20までの数の中で、3の倍数または5の倍数のみを出力するプログラムをwhile
文とcontinue
文を使って作成しましょう。
解答例
ネストしたループのbreak
とcontinue
ループをネスト(入れ子)にした場合、break
とcontinue
はfor
文の場合と同様に、それらを含む最も内側のループにのみ作用します。
上記の例では、内側のループでのbreak
は内側のループのみを抜け、外側のループは引き続き実行されます。
while-else
文
for
文と同様に、while
文にもelse
節を追加することができます。
else
ブロックは、ループが正常に終了した場合(break
で中断されなかった場合)に実行されます。
上記例では、偶数が見つかるとすぐにbreak
文でループを抜けるため、else
ブロックは実行されません。
偶数が見つからないでループが正常終了した場合のみ、else
ブロックが実行されます。
for
とwhile
の使い分け
for
文とwhile
文の使い分けとしては、よりシンプルに書ける方を採用しましょう。
for
ループが適しているケース:
- 回数が決まっている反復処理
- イテラブル(リスト、タプル、文字列など)の各要素に対する処理
range()
関数で表現できる、一定の範囲での繰り返し
while
ループが適しているケース:
- 終了条件が動的に変化する場合
- 無限ループが必要で、特定の条件でのみ終了する場合
- 処理回数が事前にわからない場合
while
文まとめ
while
文は条件がTrue
である限り、繰り返し処理を実行するfor
文は回数が決まっているループに、while
文は条件が決まっているループに適しているbreak
文でループの中断、continue
文でループのスキップができるelse
節を使うと、ループが正常終了した場合(break
で中断されなかった場合)の処理を記述できる- 無限ループに注意し、必ず終了条件を設けるようにする
- カウンタ変数を使う場合は、初期化と更新を忘れないようにする
1~100のランダムな数を当てるゲームを作成しましょう。
- プログラムが1~100のランダムな数を1つ選びます
(random
モジュールを使用しますが、解説がまだのため、あらかじめ実装済みです) - ユーザの予想する数値を繰り返し受け取ります
- 予想値に対し、「もっと大きいです」または「もっと小さいです」といったメッセージを表示します
(ヒント: 入力された文字列を数値に変換して処理を行います) - ユーザの予想した数値が正しい場合、「正解です!」と表示してゲームを終了します
- ユーザが「exit」を入力した場合、ゲームを終了します