Python のデフォルト引数に辞書を使う件 [Python]
http://d.hatena.ne.jp/kwatch/20080415/1208274736
これについては個人的には関数のキャッシュの置き場所としてわりと重宝してるのでこのままでいいかなあと思う。
こんな風なコードの書き換えを良くする。
スコープ的にグローバルというわけではなく、それでいて関数呼び出しをまたいで寿命があるオブジェクトが作れるので割りとうまい具合に収まります。まあなんか泥臭い気がするよ?といわれればそうかもしれないのですが。
Python で関数の戻り値をキャッシュするときの手軽なイディオムが他にあれば知りたいところです。
def f(d={}) という定義があった場合、Ruby では「{}」が関数呼び出しごとに評価されるので、関数呼び出しごとに新しい Hash オブジェクトが生成される。 これに対し、Python では「{}」が定義時にしか評価されないので、dict オブジェクトは定義時に 1 回だけ生成され、それが毎回引数として渡される。
これについては個人的には関数のキャッシュの置き場所としてわりと重宝してるのでこのままでいいかなあと思う。
こんな風なコードの書き換えを良くする。
def fib1(n):
if n <= 2:
return 1
else:
return fib1(n-2)+fib1(n-1)
def fib2(n, cache={}):
if cache.has_key(n):
return cache[n]
if n <= 2:
return 1
else:
cache[n] = fib2(n-2)+fib2(n-1)
return cache[n]
スコープ的にグローバルというわけではなく、それでいて関数呼び出しをまたいで寿命があるオブジェクトが作れるので割りとうまい具合に収まります。まあなんか泥臭い気がするよ?といわれればそうかもしれないのですが。
Python で関数の戻り値をキャッシュするときの手軽なイディオムが他にあれば知りたいところです。
コメント 0