Pythonインタラクティブガイド - ステップ2 制御フロー (4) - ループ (2): while文
- 本講座「Pythonインタラクティブガイド」は、手を動かしながら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」を入力した場合、ゲームを終了します