得点による成績わけ

プログラミングの入門本によくある、入力された点数を元に成績を出すプログラムを書く。普通に書けばこんなかんじになる。
プログラムI

#!/usr/bin/env python

score = 90

if 0 <= score < 40:
    print "you are D."
elif 40 <= score < 60:
    print "you are C."
elif 60 <= score < 80:
    print "you are B."
elif 80 <= score <= 100:
    print "you are A."
else:
    print "Erro: Your score is %d. Why???" % score

なにも知らないと条件に、40 <= score and score < 60 と書きがちだが、40 <= score < 60 とより自然に書ける。


もう一つの方法として以下の様な書き方ができる。
プログラムII

#!/usr/bin/env python

D = range(0,40)
C = range(40,60)
B = range(60,80)
A = range(80,101)

score = 50

if score in D:
    print "you are D"
elif score in C:
    print "you are C"
elif score in B:
    print "you are B"
elif score in A:
    print "you are A"
else:
    print "your score is %d. Why???" % score

ココのソースを読んでいて知った方法なのだが、「scoreがDにあれば」と言うように読むことができる。ある意味、より自然言語っぽい。しかし、実行コストはどう考えても不利。timeitモジュールを用いて実行速度を計測した結果。

score=0の場合
プログラムI 0.5548861026763916
プログラムII 0.47245001792907715
score=2の場合
プログラムI 0.54223418235778809
プログラムII 0.57019996643066406
score=100の場合
プログラムI 1.1403129100799561
プログラムII 6.2671980857849121

score=0の時こそプログラムIIの方が速いが、score=2あたりで逆転される。score=100の時には5~6倍の差となる。


可読性は上がるので使いどころを間違わなければ有効な書き方かなと思った。