>>> def cache(fun): ... m = {} ... def inner(x): ... if x in m: ... print "return cached value" ... return m[x] ... m[x] = fun(x) ... return m[x] ... return inner ... >>> @cache ... def fun1(x): ... s = 0; ... for i in range(1, x): ... s += x; ... return s ... >>> @cache ... def fun2(x): ... s = 1 ... for i in range(1, x): ... s *= x; ... return s ... >>> >>> print fun1(5) 20 >>> print fun1(5) return cached value 20 >>> print fun2(5) 625 >>> print fun2(5) return cached value 625