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節と使い方の意味合いが異なるので、「コードの可読性に難あり」という意見もあるので、注意が必要です。