このページではfor文でよく使われるelseの使い方について詳しく解説します。細かい点について意外と知らない方が少なくないので、ぜひ当記事を、再確認のために役立てて頂ければと思います。
for文の基本については「Pythonのfor文によるループ処理の基本」で解説しています。ぜひご確認ください。
1. for文のelseとは
for文は「あるイテラブルの要素を全て取り出すまで指定の処理を繰り返す」、または「指定の処理を任意の回数繰り返す」時に使う構文です。この繰り返し処理を「forループ」といいます。対比として、ある条件が真(True)である間は指定の処理を繰り返す「whileループ」もあります。
この中でelseでは、「ループ処理を正常に終了した時に実行する処理」を指定することができます。これはPythonでは次のように書きます。
for i in イテラブル:
処理文 #半角4文字のインデント
else:
処理文 #半角4文字のインデント
まずforブロックを書いてからelseブロックを書きます。elseブロックの処理文は、else: の次の行に半角4つ分のインデントを空けて書きます。なお、breakやcontinueと違ってelseの行頭にはインデントは不要ですのでご注意ください。
forループの中でのelseの流れを図にすると以下のようになります。
もしかしたら、この図を見ただけで気付いた方もいるかもしれませんが、わざわざelseがなくても、下図のようにforループを終了した後に同じ処理を書けば、同じことのように見えます。
実際に次のコードでは同じ出力結果が得られています。
list = [1, 2, 3, 4, 5]
for i in list:
print(i)
else:
print('forループが正常に終了しました。')
list = [1, 2, 3, 4, 5]
for i in list:
print(i)
print('forループが正常に終了しました。')
それではelseは意味がないのかというと決してそんなことはありません。実はforループのelseが真価を発揮するのは、中断条件を指定するbreakと組み合わせた時なのです。
2. for文のelseはbreakと組み合わせて使う
forループの中でelseとbreakを組み合わせると条件分岐は下図のようになります。
forループが正常に終了した時はelseブロックが実行され、forループが途中で中断した時はbreakブロックが実行されます。つまり、elseを入れることによって、forループを正常に終了したのか、それとも途中でbreakで中断されたのかを確認することができるのです。
実例を見てみましょう。
次のコードでは、リストから取り出した要素が整数でない場合に処理を中断してbreakするものになっています。
nums = [1, 2, 3.5, 4, 5]
for num in nums:
if not isinstance(num, int):
print('breakしました。')
break
print(num)
else:
print('forループが正常に終了しました。')
リストの三つ目の要素の値が3.5で浮動小数点数なので中断条件に該当してbreakしました。この時、forループは正常に終了していないのでelseブロックの処理は実行されていませんね。
続いて、以下のコードをご覧ください。中断条件は同じですが、今回はリストの中に整数以外の要素は含まれていません。
nums = [1, 2, 3, 4, 5]
for num in nums:
if not isinstance(num, int):
break
print(num)
else:
print('forループが正常に終了しました。')
そのためforループが正常に終了して、elseブロックの処理が実行されています。
このようにforループの中でelseとbreakを一緒に使うことで、forループが終了したのか、途中で中断したのかを把握することができます。
3. for文のelseとcontinueの関係
条件分岐を書くときには中断条件のbreakの他に、スキップ条件のcontinueもあります。continueは、下図のように条件に該当する場合、その処理をスキップして次の処理に移るというものです。
continueをelseと組み合わせると次のような経路になります。
breakの時は中断条件に該当するとelse文は実行されませんでしたが、continueの場合はスキップ条件に該当してもループは正常に終了するのでelseブロックの処理は実行されます。
実際のコードで確認してみましょう。
nums = [1, 2, 3.5, 4, 5]
for num in nums:
if not isinstance(num, int):
print(f'スキップしました({num}は整数ではないため)。')
continue
print(num)
else:
print('forループが正常に終了しました。')
スキップ条件に該当してスキップしても、elseブロックの処理が実行されているのが分かりますね。スキップするとelseブロックは実行されないと勘違いしないように注意しましょう。
4. まとめ
ここまで見てきたように。for文のelseはforループが正常に終了した時の処理を書くものです。elseの真価はbreakと組み合わせた時にあります。これらを組み合わせると、breakした時にはelseは実行されず、breakしなかった時にelseが実行されるというプログラムになります。
つまり、elseの真価は、forループが途中で中断したのか、最後まで正常に終了したのかを明確にしてくれるところにあると言えます。
なお、elseとcontinueを併用した場合は、continueのスキップ条件に該当してもelseブロックの処理は実行されます。
これらの点をしっかりと押さえておきましょう。
なお、elseとbreak、continueを全て組み合わせると次のような条件分岐経路になります。
「Pythonのforループによる繰り返し処理の基本」では、これのコード例も書いていますので、ぜひ確認してみてください。
コメント