Pythonをこれから始めようとする人、又は始めたばかりの人に向けて、while 文の使い方を解説します。
出来るだけ図を使って分かりやすくなるよう心掛けています。
while 文については他のサイトで数多く解説されていますが、この記事では while 文を使った応用事例、for 文との対比についても触れています。
他のサイトを読んでも理解できなかった方は、是非この記事をご一読ください。
while 文の基本形
while 文は、指定した条件式が成り立つ(True) 間だけループするものです。
for 文 は、指定された配列構造のデータに対して、その要素数だけループしていたのに対し、while 文は 条件式が成り立たなくなるまでループするという違いがあります。
while 文は for文と同様に、continue、break を記述することにより、ループの先頭に戻ったりループを中断することが可能です。
また、for 文と同様に else が用意されており、while ループから抜けた直後に実行したい処理を記述出来ます。
尚、while 文における else の挙動も for 文 と同じで、break によりループを中断すると、else で記述した処理は実行されません。
条件式で使える演算子
while で指定できる条件式は if 文と全く同じでで、以下の比較演算子が利用可能です。
比較演算子 | 意味 |
---|---|
a == b | a と b は等しい |
a != b | a と b は異なる |
a < b | a は b より小さい(a は b 未満である) |
a > b | a は b より大きい |
a <= b | a は b 以下 |
a >= b | a が b 以上である |
a is b | a が b と等しい(a は b である) |
a is not b | a とb は異なる(a は b ではない) |
a in b | a が b に含まれている |
a not in b | a が b に含まれていない |
また、複数の条件式を組み合わせたい場合も if 文と同様に、次の論理演算子を用いることが出来ます。
論理演算子 | 意味 |
---|---|
c1 and c2 | c1 と c2の両方が成り立つ |
c1 or c2 | c1 と c2 のどちらか、又は両方が成り立つ |
not c1 | c1 を否定 (c1 がTrueの場合はFalseを、Falseの場合はTrueを返す) |
while 文における注意点
初心者の間はやりがちなのですが、while に指定する条件がいつまでも True にならず、無限にループを繰り返してしまう場合があります。
最もよくあるパターンが、条件文に指定した変数の値を更新し忘れて、無限ループに陥るパターンです。
下記の例は x が 10 になるとループ処理を終了するつもりで書いたサンプルですが、 x を更新する(カウントアップする)処理が抜けているため、無限ループになってしまいます。
#無限ループに陥るパターン x = 0 while x < 10 : print(x)
正しくは、while ループの中に x を更新する処理を記述します。
x = 0 while x < 10 : x += 1 print(x)
今回のように短いプログラムだと分かりやすいですが、 if 文と continue を多用した複雑な処理を記述する場合、ある条件を満たした途端に無限ループに陥ることもあるので気を付けましょう。
# x が 1になった時点で if文に記述した continue が実行され、以降は x += 1 が # 二度と実行されなくなる⇒ 無限ループ x = 0 while x < 10 : if x % 2 : continue print(x) x += 1
ループの先頭に戻る continue 文
while によるループ処理の中に continue を記述すると、それが実行された時点で後続の処理をスキップし、ループの先頭に戻ります。
下記は x が 10未満 の間ループし続けるプログラム例ですが、x % 2 (x を2で割った余りを求める式)を if文 の条件に指定することで、偶数のみ print するようにしています。
if文 の条件式に計算式を指定した場合、 1以上なら True 、0 なら False と解釈されるため、x % 2 の結果が奇数の場合は continue により後続の処理である print(x) がスキップされ、結果的に偶数の値だけが print されます。
x = 0 while x < 10 : x += 1 if x % 2 : continue print(x)
ループから抜ける break 文
while によるループ処理の中に break を記述すると、それが実行された時点で処理を中断し、ループから抜けます。
下記は x が 10未満 の間ループし続けるプログラム例ですが、 if 文で、x % 2 (x を2で割った余りを求める式)の結果が 1 (True)になったら break 文を実行するようになっています。
この場合、x が 0 の場合は print(x) が実行されますが、x が 1になると if 文に指定した x % 2 が1(True)似なるため break 文が実行されます。
break が実行されるとループ処理が中断されるため、print(x) は1回だけ実行されるという結果になります。
無限ループを利用した while 文
本ブログの最初のところに while 文の注意事項として無限ループについて軽く解説しましたが、逆に無限ループを積極的に利用するケースもよくあります。
例えば、キーボードから特定の文字が入力されるまでループし続けるようなケースです。
下記は input 関数を使ってキーボード入力を読み取り、’e’ が入力された時点でループを終了する例です。
while True: x = input() if x == 'e' : break print('key=' + x)
do while 文
C#やJava などのメジャーなプログラミング言語に用意されていて、Python に存在しなループ処理として do ~ while 文があります。
while の場合、ループ処理に入る前に条件式の判定が行われますが、do ~ while はループ処理が終わる毎に条件式の判定が行われます。
Python では do ~ while が使えませんが、while 文の無限ループと if 文を組み合わせることで同じことが実現できます。
具体的には以下の通り while True で無限ループを作り出し、ループの最後にループを抜ける if 文と break 文を記述するだけです。
while True: x = input() print('key='+ x) if x == 'e': break
while が 終了した直後に実行される else 文
while の else 文は 、while ループが終了した直後に実行させたい処理を記述します。
但し、break 文で while ループを抜けた場合、 else に記述した処理は実行されないので、あくまでも「 ループ処理の一部として最後に実行される」と考えた方が分かりやすいでしょう。
x = 0 while x < 10 : x += 1 if x % 2 : continue print(x) else : print('終了')
まとめ
今回は python の while 文に関する基本的な内容について解説しました。
配列構造のデータの要素数だけループする for文とは違い、while は 指定した条件文が True の間、ずっとループし続けるものです。
for ループと同様に、先頭に戻る continue 文や、for ループを途中で中断する break文が用意されおり、else 文も用意されています。
for 文ほどではないものの、while によるループ処理もよく利用されますので、まだあまり理解できていない方は、これを機に是非マスターしてみて下さい。
今回の記事が参考になれば幸いです。