[Python] for・whileループ後のelse節の使い方

Python フロー制御

for・whileループ文はelse節を使って分岐を設けることができますが、if文等でのelse節と意味合いが少し異なります。本記事では、この辺の注意点も併せてfor〜else文の使い方について、自分用の備忘録も兼ねてまとめました。

確認した環境

  • OS: Ubuntu16.4LTS
  • Python 3.7.2

for – else文の使い方

forループでのelse節の動作は以下です。

  • forループの処理が全部終わった場合: else節の中身を実行
  • forループ中にbreakされた場合: else節は実行されずに次の処理を実行

以下にコード例を記載します。

for i in range(5):
    if i == 10:
        print('stop')
        break 
    print(i)
else:     # forループの処理が全部終わるとここに飛ぶ
    print('OK')

出力結果は以下です。
forループがbreakで中断せずに処理が全部終わると、else節が実行されています。

0
1
2
3
4
OK ★forループの処理が全部終わるとelse節を実行

上記コードを少し書き換えて、forループの途中でbreakするようにしてみます。

for i in range(5):
    if i == 3: # forループの途中でbreakするようにここを修正
        print('stop')
        break
    print(i)
else:
    print('OK')

出力結果は以下の通りです。forループがbreakで途中で中断されると、else節は実行されずプログラムが終了していることが解ると思います。

0
1
2
stop ★forループが途中でbreakされプログラムが終了

次に、forループにcontinueが入った場合の例を示します。

for i in range(5):
    if i == 3:
        print('stop')
        continue   # ここにcontinueが入った例
    print(i)
else:
    print('OK')

出力結果は以下です。continue文がforループの中で実行されると、残りの文の実行をスキップして、次の要素の処理に移るか、forループが全部完了した場合はelse節に移動します。

0
1
2
stop  ★ continue文により次の要素に移動
4
OK  ★forループの処理が全部終わるとelse節を実行

尚、このelse節はwhile文の時も使えます。下記に例を示します。

i = 0
while(i < 5):
    if i == 3:
        print('stop')
        break
    print(i)
    i += 1
else:
    print('OK')

出力結果

0
1
2
stop

尚、空シーケンスでループした場合は、即座にelse節が実行されます。

 for n in []:  # 空シーケンスでループする
     print(n)
 else:
     print('Empty loop!')

出力結果

>>> Empty loop! ★即座にelse節を実行

注意点(のようなもの)

ここで、このelse節は、書籍「Effective Python ―Pythonプログラムを改良する59項目」では推奨されていません。
なぜかというと、if文などで使われるelse節と逆の意味合いになっていて、「わかりにくい」からです。

  • if文のelse節: ある条件を満たさない場合に実行される
  • for文のelse節: for文が全部完了した場合(=for文の条件を満たした場合)に実行

よって、上記書籍では「読みやすさを優先すべし」ということで、結果変数(フラグ)を使う方法条件を満たしたら即returnで抜ける方法を紹介しています。(私の解釈が間違っていたら、訂正頂けると助かります。。)

  • 結果変数(フラグ)を使う方法
for i in range(5):
    flg = True

    if i == 3:
        print('stop')
        flg = False  # 条件を満たすとflg=Falseをセットしてbreak
        break

    print(i)
        
if flg == True:  
    print('OK')
  • 条件を満たしたら即returnで抜ける方法
def func():  
    for i in range(5):
        if i == 3:
            print('stop')
            return False # 条件を満たしたらreturnで関数を抜ける
        else:
            print(i)
    return True

if func():
    print('OK')

どちらも出力結果は下記の通りです。

0
1
2
stop

まとめ

for・whileループ後のelse節の使い方についてまとめました。if文などでのelse節と使い方の意味合いが異なるので、「コードの可読性に難あり」という意見もあるので、注意が必要です。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project