このページではPythonのwhile文によるループ処理(whileループ)についての基本を解説します。whileループは非常によく使う処理ですので、ここでしっかりと理解しておきましょう。
1. while文とは
while文は「ある条件を満たす間(Trueの間)、指定の処理を繰り返す」というコードを書くときに使うプログラミング構文です。
同じような繰り返し処理を行うのにfor文もありますが、for文は「あるオブジェクトの要素を全て取り出すまで指定の処理を繰り返す」というものです。このfor文については「Pythonのfor文による繰り返し処理(forループ)の基本」で解説しています。
2. while文の基本的な書き方
それでは、while文の基本的な書き方を見てみましょう。
while 条件式: # ←末尾にコロン「:」
処理文 # 処理文の前に半角スペース4つ
このコードを書くとPythonは次のように条件式がTrueの間、ずっと指定の処理をループします。
例えば次のコードをご覧ください。
num = 1
while num <= 5:
print(num)
num += 1
このコードのwhileループの条件式は「num <= 5」つまり「変数numの値が5以下の時」となっています。そしてループ1回ごとに、「num±1」で変数numに1をプラスしていきます。最終的にnumの値が6になった時点でループを終了していますね。
3. while文の条件分岐のパターン
続いてwhile文の条件分岐のパターンを解説します。次の文を使うと、様々なパターンを作ることができます。
- break:特定の条件の時にwhileループを終了
- continue:特定の条件の時に処理を全てスキップしてwhileループに戻る
- else:whileループを正常に終了した時の処理を追加
それぞれ見ていきましょう。
3.1. breakで特定の条件の時にwhileループを終了
whileループの中にbreakを入れると、そこでループを終了します。次のように書きます。
while 条件式:
処理文 # 任意
if 条件式: # 中断条件をif文で指定
処理分 # 任意
break # ここでブレイク
処理文 # 任意
breakの条件式はif文で書き、その条件に該当した時にはbreakしてwhileループを中断、該当しない時はそのままwhileループを継続という流れになります。if文については「Pythonのif文を使った条件分岐の基本と応用」をご確認ください。
これを図にしたものが以下です。
実際のコードを見てみましょう。
以下のコードは「numの値が5以下の間」はwhileループを繰り返しますが、if文で「numの値が4の場合」にbreakを実行するように指定しています。結果、数値の4は出力されずにwhileループが終了しています。
num = 1
while num <= 5:
if num == 4:
break
print(num)
num += 1
「Pythonのwhile文のbreakを使ったループの中断条件の作り方」ではさらに詳しく解説していますので、ぜひあわせてご確認ください。
3.2. continueで処理をスキップして次のループに移る
whileループの中にconinueを入れると、そこでそれ以降の処理を全てスキップしてループの最初に戻ります。
次のように書きます。
while 条件式:
処理文(任意)
if 条件式:
処理文(任意)
continue
処理文(任意)
スキップ条件をif文で書き、そのif条件に該当した時に以降の処理をスキップして、次のwhileループに移ります。if条件に該当しない場合は、そのまま処理を行います。なおif文については「Pythonのif文を使った条件分岐の基本と応用」をご確認ください。
流れを図にすると以下のようになります。
実際のコードを見てみましょう。
以下のコードは、if文で「numの値が4の場合」にcontinueを実行するように指定しています。結果、その時だけ以降の処理がスキップされて、次のループに移り「5」が出力されています。
num = 1
while num <= 5:
if num == 4:
num += 1 # ←これを入れておかないとnum=4で無限スキップになってしまう。
continue
print(num)
num += 1
なお、if文とcontinueの間に「num += 1」を書いていますが、これがなければ、ずっと「num = 4」になり、continueの無限ループになってしまいます。これは、whileループでcontinueを使うときに、つい忘れがちなミスなので、ここでしっかり頭に入れておきましょう。
こうした注意点も含めて「Pythonのwhile文のcontinueを使ったループのスキップ条件の作り方」で、より細かく解説していますのでご確認ください。
3.3. elseでループを正常に終了した時の処理を追加
elseは、whileループが正常に終了した時の処理を追加するものです。次のように書きます。
while 条件式:
処理文(任意)
if 条件式:
処理文(任意)
break
処理文(任意)
else:
処理文
注意点として、while文とelseは同じ行頭に書きますのでインデントの必要はありません。またelseはそれ単体では意味がなく、breakと組み合わせて使うことによって意味があります。
下図をご覧ください。elseブロックの処理は、breakが実行された時は実行されずに、breakが実行されなかった時のみ実行されるのです。
実際のコードを見てみましょう。
以下のコードではbreak条件に該当しないので、elseブロックの処理は実行されます。
num = 1
while num <= 5:
if num == 6:
break
print(num)
num += 1
else:
print('whileループが正常に終了しました。')
しかし、以下のコードではbreakが実行されているので、elseブロックの処理は実行されずに、そのままwhileループを終了しています。
num = 1
while num <= 5:
if num == 4:
break
print(num)
num += 1
else:
print('whileループが正常に終了しました。')
「Pythonのwhile文のelseでループ終了後に実行する処理を作る方法」でさらに解説しているので、ぜひあわせてご確認ください。
4. 無限のwhileループ
while文は条件式がTrueの間は指定の処理を繰り返します。ということは、条件式が常にTrueであれば無限ループになるということです。無限ループは、代表邸には、例えば毎日、その日の日付や現在時刻を表示するなどの永続的な時間処理などで使います。
Pythonでは、これを「while True:」と書くことで実現することができます。厳密には、比較演算子以外でPythonでFalseと判定されるのは次の4つなので、これ以外を渡せば、例えば「while 1:」や「while ‘無限ループ’」などと書いても無限ループになります。
- ブール値としてのFalse
- None(null)
- 数値の0(整数:0、浮動小数点数:0.0、複素数:0j)
- 空の文字列、リスト、タプル、辞書
これについては、「Pythonのif文を使った条件分岐の基本と応用」の「1.2. 条件式の判定(True or False)について」でも解説していますので、ぜひ確認してみてください。
さて無限ループを使うと、例えば、次のような好きなだけ練習できる計算クイズなどを作ることができます。
import random
print('問題です。(qを入力すると終了します。)')
while True:
a = random.randint(1, 100)
b = random.randint(1, 100)
correct = a + b
answer = input(f'{a}+{b}は?:')
if answer == 'q':
print('計算クイズを終了します。')
break
if int(answer) == correct:
print('正解')
else:
print('不正解')
注意点として、無限ループは文字通り無限に処理を繰り返すので、breakを入れておかなければ終了することができないことを覚えておきましょう。また無限のwhileループについては、『Pythonの「while True:」による無限ループの解説』でさらに理解を深めておきましょう。
5. まとめ
whileループは条件式がTrueの間、指定の処理を繰り返します。条件式はif文で書くので、if文もしっかり理解しておきましょう。またbreak, continue, elseを使うことで様々な条件分岐を作ることができます。
最後に無限ループを作りたい時は、「while True:」などで常にループを回るようにします。この時は、breakで中断条件を入れる癖もつけておきましょう。
コメント