Pythonのforとelse

Pythonではforやwhile,tryの後にelseを書ける事を今日知った。if文がelseのすぐ前にあるからインデントを間違えているんじゃないのかと思ったが、実行してみても文法エラーにならないため、調べてみたらそういう書き方があったのだ。

for i in range(5):
  print i
  if i > 2:
    break
else:
  print "test"

上記のコードの実行結果は以下の通りである。

0
1
2
3

for文のあとのelseが実行されるのはbreakされずに全てのループを消化し終えた場合のみ。制御フラグを使ってこういう切り分けをする場合は便利なのかもしれないが、他で見ない書き方なので混乱するかもしれない。


また、while文のあとにもelseが使えるが、これも同様にwhileブロック中でbreakが使われなかった場合のみelseブロックが実行される。例えば以下のような場合である。

while False:
  print "true1"
else:
  print "false1"

flag = True
while flag:
  flag = False
  print "true2"
else:
  print "false2"

実行結果は以下の通りである。

false1
true2
false2

ま、こういう書き方もあるので驚かないようにと。