関数で複数の返り値を返す方法
pythonにおいて関数で複数の値を返すと、デフォルトではタプルになる。
def f_tuple(x): plus = x + 1 cubic = x ** 3 return (plus, cubic) result = f_tuple(2) print result[1]
returnの後の(plus, cubic)はカッコをのけても同じ動きをする。
また、受け取る時に、plus, cubic = f_tuple(2)のように受けても良い。
変数が少ない場合には上の書き方でよいが、返す値の数が多くなると、どれがどの返り値か分からなくなる。
上の例ではresult[1]で3乗した結果の値を取り出しているが、インデックスで指定するやり方だと、その要素が何の値なのか分かりにくい。
そこで、タプル以外で返り値を返すことを考えてみる。
辞書
def f_dict(x): plus = x + 1 cubic = x ** 3 return {'plus':plus, 'cubic':cubic} result = f_dict(2) print result['cubic']
クラス
class ReturnValue(object): def __init__(self, plus, cubic): self.plus = plus self.cubic = cubic def f_class(x): plus = x + 1 cubic = x ** 3 return ReturnValue(plus, cubic) result = f_class(2) print result.cubic
or
def f_class2(x): class ReturnValue(object): plus = x + 1 cubic = x ** 3 return ReturnValue result = f_class2(2) print result.cubic
Named tuple
Named tupleについてはこちらNamed tuple - おっぱいそん!を参照。
import collections def f_named(x): plus = x + 1 cubic = x ** 3 result = collections.namedtuple('result', 'plus, cubic') return result(plus=plus, cubic=cubic) result = f_named(2) print result.cubic
調べたところによると、Named tupleを使うのがいいらしい。
正直、理由はいまいち分からなかった。
わざわざ、クラスを定義するよりはシンプルだが、辞書に比べて、collectionsをimportする必要があるのと、namedtupleでクラスを作る必要があり、少しコードが長くなる。
ただ、呼び出すときは、オブジェクト的な書き方ができるので、辞書より便利(例えば、エディタで補完が効く)。
http://stackoverflow.com/questions/354883/how-do-you-return-multiple-values-in-python?lq=1
http://stackoverflow.com/questions/61605/is-it-pythonic-for-a-function-to-return-multiple-values
http://blog.livedoor.jp/odaxsen/archives/1566815.html