得点による成績わけ
プログラミングの入門本によくある、入力された点数を元に成績を出すプログラムを書く。普通に書けばこんなかんじになる。
プログラム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倍の差となる。
可読性は上がるので使いどころを間違わなければ有効な書き方かなと思った。