Pythonのfor〜else構文


今まで知らなかったんですが、Pythonだとfor〜elseが使えます
elseブロックが処理されるのは、breakされることなく、ループ処理が終了した後です

for i in 10:
    if i == 0:
        break
else:
    print("foo")

この場合、breakでループを抜けるので、elseブロックは処理されません
以下の例ではbreakされることはないのでelseが処理され、barとprintされます

for i in range(10):
    if i == 10:
        break
else:
    print("bar")

# =>  bar

使い所

forを使ってリストを走査して、目的の値を見つけたらbreakする。見つかったかどうかで後続に処理分岐がある、そんなケースで使えそうです。

def contain_private_entry(entries):
  for e in entries:
    if e.is_private():
      print "list contains an private entry"
      break
  else:
    print "list does not contain an private_entry"

個人的感想

とはいえ、あまり普及している構文とはいえない(と思う。ひょっとして常識っすか?)と思うので、これみよがしに多用するのは避けたほうがいいのかなーと。

というかfor〜finallyのほうがいいんじゃないかなとも思ったんですが、それはそれでjava慣れしている人からしたら、breakされようが絶対実行される、誤解されそう