処理の順番の重要性を考える。
コードを書く時、僕は思いついた順にコードを書き連ねていきます。大抵はそれで上手くいっていたんですが、今日とあるコードを書いていた際、分岐の順番の違いからくるエラーに直面したので、記録に残しておこうと思います。
例えば
def func(List):
if List[0]=='a':
print('python')
elif List==:
print('it's empty!!')
という関数を作ったとします。一見Listの先頭が'a'だった場合にはpython、Listが空っぽだった場合にはit's empty!!を値として返すというだけの関数に見えますが、ここに重大な欠点があります。
この関数に「」を代入してみると、
func()
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
func()
File "<pyshell#19>", line 2, in func
if List[0]=='a':
IndexError: list index out of range
となり、エラーが返ってきます。このときエラーが2行目で起きていることが問題なのです。
この関数では空のリストに対応する処理が設定されていたはずなのに、その処理より以前に別の処理が存在するためにそちらが優先されてしまいます。その結果、せっかく設定した処理が活かされなくなってしまうのです。
上の例では以下のように分岐の順番を入れ替えることでこの間違いを回避することができます。
def func(List):
if List==[]:
print('it's empty!!')
elif List[0]=='a':
print('python')
こうすればリストが空か否かをまず分岐として設定することができ、仮に空でなかった場合のみ4行目の分岐に進むようにできます。
どうやら分岐は、多くの場合が対象となるものは後に、ごく少数の場合が対象となるものは先に書くのがいいようです。言い換えれば分岐は条件がキツい順に書くべきということです。(例えば「空のリストに対する分岐」は「リスト全般に対する分岐」より先に書く、「自然数に対する分岐」は「整数に対する分岐」より先に書く等)
実は自分で書いたコードの中にも無意識のうちにこの法則を実践してるものがちらほらあったのに後で気が付きました(笑) 間違えてみるまで気づかないものですねぇ・・・。これからもガンガン間違えていきたいと思います(爆)