while文は「一まとまりの処理を繰り返し実行する」ために使う構文です。同じ繰り返し処理としてはfor文もあります。
本稿では「whileとは何?」「whileのおすすめの使い方を知りたい」「whileの注意点は?」といったPython入門者の方向けに、whileの記述方法、使い方を紹介していきます。
YouTubeも公開していますので、動画や音声で聞きたい方はぜひご覧ください。
Pythonの繰り返し処理・whileとは?
whileは、指定した条件が真(true)の間同じ処理を繰り返す(ループ処理)構文のことです。同じようなものにfor文がありますが、同じ処理をそれぞれの形で記述することが出来ます。
同じ処理の繰り返しなので、基本的には処理が無限に続くことになります(ゆえに「無限ループ」とも呼ばれます)。現実的なプロダクトを考えた場合にはどこかで処理を止める、終わらせなければならないので、後述するbreakなどが繰り返しからの抜け出しとして用いられます。
ではwhileの使い方を見ていきましょう。
while文の基本的な使い方
whileは、条件を満たし続ける間同じ処理を繰り返します。まずは実際にwhileを使った最も基本的な繰り返し処理を実行してみましょう。以下は「1から5までの合計値を出力する」プログラムです。
[サンプルコード]
num = 1
sum = 0
while num <= 5:
print(num)
sum += num
num += 1
print("--")
print(sum)
初めに、変数numに1、変数sumに0を代入しています。numはsumに足し合わせる数値です。
次にwhileです。num <= 5が条件式です。whileではこの条件がTrueであり続ける限り、インデントされた一連の処理が繰り返し実行されます。最初にnumを1で初期化したので、whileは条件を満たしています。
while内では次の処理をしています。
- 変数numの現在の数値を出力
- sumにnumを加算
- numに1を加算
3番目でnumに1を加算しているので、いずれnumは6になります。
numが6になると、num <= 5の条件を満たせなくなるので、whileの繰り返しから抜け出します。numは1ずつ加算され、1、2、3、4、5と繰り返すたびに数値が変わっています。結果として、sumには「1 + 2 + 3 + 4 + 5」の合計値が入ることになり、15が出力されています。
[出力結果]
1
2
3
4
5
--
15
これがwhileの基本的な使い方です。
whileもifと同じくインデントが必要なので注意しましょう。
[構文]
while 条件式:
# インデント開始(空白)
命令1
命令2
命令3
# インデント終了
無限ループとbreak
先ほどの繰り返し処理では、変数numが6に到達するため、num <= 5の条件を満たさず、whileを抜け出せました。
無限ループとは
しかし、間違えて num >= 0にしてしまったらどうなるでしょうか?
以下で実際にやってみましょう。
[サンプルコード]
num = 1
sum = 0
while num >= 0: #変更
print(num)
sum += num
num += 1
print("--")
print(sum)
実際にやってみた方はいかがでしょうか?
恐らくずっと動かない状態、またはずっと動き続ける状態になるかと思います。また、実行環境によってはタイムアウトになっているかもしれません。もしPythonをインタラクティブモードで動かしている場合は、Controle + zキーで強制終了できます。
このように、whileは処理を無限にさせることができます。このことを「無限ループ」と呼びます。
break文の使い方
無限ループの状況でも、break文を使うことでwhileから抜け出せます。具体的には、while文の中でループ処理を終わらせる条件を設定し、当てはまればbreakで抜け出す(処理を終了させる)ことになります。
ではbreakの使い方を見てみましょう。
[サンプルコード]
import random
count = 0;
while True: #条件は常にTrueなので無限ループ
count += 1
i1 = random.randint(1, 6)
i2 = random.randint(1, 6)
i3 = random.randint(1, 6)
if ((i1 + i2 + i3) == 3):
break
print("1のゾロ目が出ました。試行回数は" + str(count) + "です。")
これは「3つの数値が全て1が出るまで繰り返し処理を続ける」プログラムです。
変数countは繰り返し処理をするたびに1ずつ増加していきます。また、今回も辞書の説明の時に使った「random」モジュールを使っています。変数i1〜i3には1〜6の整数がランダムで入ります。そして、i1〜i3が全て1だった場合、break文でwhileを抜け出しています。最後に1のゾロ目が出るまでの試行回数を出力しています。
[出力結果]
1のゾロ目が出ました。試行回数は187です。
無限ループは危険性もありますが、breakをうまく使うことで、こういったプログラムを組むこともできます。
continue文の使い方
最後にcontinueについて解説します。
breakはwhileを中断し、終了するために使いましたが、continueは「今の繰り返しをスキップし、次の繰り返し処理をしたい」場合に使います。
では例を見てみましょう。
[サンプルコード]
import random
list = []
count = 0
max_num = 10
while len(list) < max_num:
count += 1
i = random.randint(1, max_num)
if i in list:
continue #iがlistに入っていたらスキップ
list.append(i)
print("1から" + str(max_num) + "までの全ての整数が揃いました。試行回数は" + str(count) + "です。")
print(list)
[出力結果]
1から10までの全ての整数が揃いました。試行回数は39です。
[1, 8, 2, 3, 6, 5, 10, 4, 7, 9]
これは「ランダムに整数を取り出し、1から10が揃うまで繰り返し続ける」プログラムです。
if文の i in listは「listの中に変数iと同じ整数がいるか」をチェックしています。
同じ整数がいる場合はcontinueでその後の処理をスキップし、次の繰り返し処理を実行しています。
以上がwhile文の基本的な使い方、記述の方法になります。Pythonに限らず、繰り返し処理はあらゆるシステムで利用されている最も基礎的な処理の一つなので、是非この記事を参考に簡単なプログラミングを組んでみてください。
for文との違いは?
ところで、冒頭で同じ繰り返し処理としてfor文があると述べましたが、両者の違いは何でしょうか?
while文は繰り返し処理をする「条件」を設定する構文です。一方for文はリストやディクショナリに代表されるコレクション(複数の要素を扱うデータ型)を設定して扱う構文です。
for文の解説は以下で詳しく行っています。繰り返し処理についてより学びたい方は是非ご覧ください!