もっと詳しく

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 によるループ処理もよく利用されますので、まだあまり理解できていない方は、これを機に是非マスターしてみて下さい。

今回の記事が参考になれば幸いです。