再帰的に関数を実行するときに返り値が取得できない
はまったこと
数値を入力させたいなど,正しい値が得られるまで同じ処理を繰り返したいことがある.
具体的には,例えばこんな感じ.
def get_number(): try: num = raw_input('enter number: ') except ValueError: get_number() else: return num get_number() type(get_number)
try節でValueErrorが発生したらexcept節で再帰的にget_number()を呼び出す.
いつかValueErrorが発生しない値が得られたら,else節でnumをreturnして終了.
そう考えたくなる.
ところが,
None <type 'NoneType'>
実行結果はこうなる.
値が返っていない.
正しい書き方
def get_number(): try: num = raw_input('enter number: ') except ValueError: return get_number() else: return num get_number() type(get_number)
except節で自身を呼び出すときにもreturnしてやると正しく実行できる.
stackoverflow.com
再帰的に実行しているときにreturnで値が返っても,最上位のtry-except文においてはelse節が実行されていないからこうなるらしい.