おっぱいそん!

pythonを数値計算に使うときのテクニックとかをまとめていきたい。

関数で複数の返り値を返す方法

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