Developer

【Python独学】while~else文の使い方
2020.11.02
Lv1

【Python独学】while~else文の使い方

while文とは、条件を満たしている間(真(true))は繰り返し処理を実行し続けるというものです。
while文での繰り返し処理が終了した後で実行する処理を記述するのに、「else」というブロックを用いることが出来ます。
今回は、while文でのelse文の意味と使い方について紹介します。


while~else文の使い方

else文があるwhile文は、次のように記述します。

while 条件式 :
    繰り返す処理1                #while文での繰り返し処理
    繰り返す処理2
       ・・・
else :
    実行する処理1                #while文が終了したら実行される処理
    実行する処理2
        ・・・

while文での繰り返し処理が終了した後に、elseブロックに記述されている処理が実行されます。
それでは、簡単な例を見てみましょう。

num = 0                         #初期値がないと、4行目の部分でエラーが出ます
while num <= 3 :                #numが3以下の場合は真(true)
    print(f"num = {num}")       #「num = 値」の書式で出力
    num += 1                    #1ずつ加算

else :                          #elseブロックの開始
    print("終了")
C:\Python> python 4-7-1.py
num = 0
num = 1
num = 2
num = 3
終了

while文での繰り返し処理が終わると、else文での処理が実行されていることがわかります。
ただし、上記のような例では、else文を使う必要はありません。次のように、while文のブロックを抜けた直後に処理を記述すれば、同じ結果になります。

num = 0
while num <= 3 :
    print(f"num = {num}")
    num += 1
print("終了")
C:\Python> python 4-7-2.py
num = 0
num = 1
num = 2
num = 3
終了

無駄にelseブロックを記述していない分、プログラムが短くなりました。
『じゃあelse文って何のためにあるの?』と思うかもしれませんが・・・
実は、breakを使用した時に、elseは意味のある働きをします。

breakがある時のelse文

else文が意味を成すのは、while文でbreakを使用した時となります。
breakは、条件にかかった場合に繰り返し処理を終了するという役割でした。

breakを使用した場合、elseブロックは次のように処理されます。
・breakの条件にかからず、正常にwhile文の繰り返しが終了した時
⇒elseブロックは実行される
・breakの条件にかかり、途中でwhile文の繰り返しが終了した場合
⇒elseブロックは実行されない

それでは、例を見てみましょう。
前回記事でも紹介した『所持金が1000円で、残り300円未満になるまでリスト内の商品をランダムに購入を続ける』といったイメージのwhile文について、elseブロックを追加してみます。

import random                                                       #randamモジュールの読み込み
money = 1000                                                        #初期の所持金1000円
feelist = [100,200,300,400,500,"apple"]                             #商品のリスト
count = 0                                                           #購入数countの初期値
while money >= 300 :                                                #残金が300円以上の場合は真(true)
    fee = random.choice(feelist)                                    #randomモジュールのchoice関数
    if not isinstance(fee, int) :                                   #feeがint型(整数)でない場合の処理
        print(fee,":無効な値のため除外。リストの値を見直して下さい。")
        break                                                       #appleが選ばれた場合はbreak
    money -= fee
    print(f"料金は{fee}円、残金は{money}")                           #料金と残金を表示
    count += 1                                                      #購入数をカウント(1つ増加)

else :                                                              #while文がbreakせずに終了した場合に実行されるelseブロック
    if money >=0 :
        print(f"\n買物終了。\n{count}個の商品を購入。")                       #\nは改行の意味
    else :                                                                     #if文のelse
        print(f"\n買物終了。\n{count}個の商品を購入、借金が発生しています。")
※出力結果1
C:\Python> python 4-7-3.py
料金は400円、残金は600
apple :無効な値のため除外。リストの値を見直して下さい。
※出力結果2
C:\Python> python 4-7-3.py
料金は400円、残金は600
料金は300円、残金は300
料金は300円、残金は0

買物終了。
3個の商品を購入。

※出力結果3
料金は400円、残金は600
料金は200円、残金は400
料金は100円、残金は300
料金は400円、残金は-100

買物終了。
4個の商品を購入、借金が発生しています。

プログラム14行目からのelseブロックは、breakが発生していない場合にだけ実行されます。

・出力結果1について
リスト内の商品から無効な値である”apple”が選ばれてwhile文がbreakした場合の出力結果となります。
つまり、elseブロックは実行されません。

・出力結果2,出力結果3について
while文がbreakせずに、繰り返し処理が無事終了した場合の出力結果となります。
つまり、elseブロックは実行されています。

elseブロックでは、商品を何個購入したのかをprintで出力しています。なお、その際にcountという名前の変数を使用して購入数を表示しています。countの初期値は0とし(4行目)、while文ループがされるたびにcountを1ずつ増やしていきます(12行目)。

また、if文を使って、残金moneyが0以上かそうでないかでprintの出力内容を若干変えています。
出力結果2は残金moneyが0以上の場合の出力結果、出力結果3は残金moneyがマイナスの値となって借金が発生した場合の出力結果となっています。
今回のように、while~else文のelseブロック内に、更にif文でのelseが使わることもあります。
同じelseでも、どこのブロックにかかっているelseであるかはしっかり把握しましょう。


まとめ

while~else文 は、while文での繰り返しが正常終了した後に行う処理を記述するのに使用します。
breakで処理が途中終了した場合には、elseブロックは実行されません。


確認問題

以下は、ランダムに生成された九九の問題が出題され、回答を入力するプログラムです。
3回正解するとwhile文が終了し、qが入力されるとbreakします。
このプログラムを実行し、3問正解させた場合の動作と、qが入力された際の動作を確認してみましょう。

from random import randint
count = 0
print("3回正解したら終了")
while count <3 :
    i = randint(1, 9)
    j = randint(1, 9)
    ans = i * j
    question = f"{i}×{j}の答えを入力してください:"
    input_value = input(question)
    if input_value == str(ans): 
        print("正解です")
        count += 1
    elif input_value == "q" :
        print("qが入力されました")
        break
    else :
        print(f"不正解。正解は{ans}でした")

else:
    print("3回正解しました。終了します。")

※以下のような動作になります。
・3回正解を入力した場合には、『3回正解しました。終了します。』という文字が表示されて終了します。
・qを入力した場合には、breakとなるので、『3回正解しました。終了します。』という文字は表示されずに終了となります。

連載目次

独学で学ぶ Pythonプログラミング 連載目次