Python decorators are generic and very powerful. You can find many examples of how they can be used at the decorator library of `python.org` (j.mp/pydeclib). In this section, we will see how we can implement a memoization decorator (j.mp/memoi). All recursive functions can benefit from memoization, so let's try a function `number_sum()` that returns the sum of the first *n* numbers. Note that this function is already available in the `math` module as `fsum()`, but let's pretend it is not.

First, let's look at the naive implementation (the `number_sum_naive.py` file):

def number_sum(n): '''Returns the sum of the first n numbers''' assert(n >= 0), 'n must be >= 0' if n == 0: return 0 else: return n + number_sum(n-1) if __name__ == '__main__': ...