Rod-Cutting Problem using dynamic programming
I rather like your memo parameter.  It makes for a faster function.  If you are interested, Python 3.2 added the functools.lru_cache function that is used as a decorator and accomplishes the same thing as your memo.

Since possible_revenues is used just to find its max value, it would be more efficient to use a generator expression because the values are generated on demand instead of all being stored in memory.  To do that, simply change [ and ] to ( and ). edit: you would also need to change from ... + ... to itertools.chain(..., ...), importing itertools of course.  When you have an open bracket (any kind, {[(), the logical line continues until it is closed.  Because of that, you don't need the backslash at the end of the line.  I would also suggest that you put the open parenthesis for the second call to find_optimum_revenue() on the same line as the function name.  When I first saw those lines, it looked like you had used a variable and a tuple, but forgot to put a comma between them.

lambda functions are meant to be used where it would be awkward to define a function.  For example, you could use a lambda as an argument to sorted().  It is helpful because you don't need to go through the whole def line just for a one-time-use function.  If you are giving a name to a lambda function, that is a sign that it is not just a simple pass-it-to-another-function deal.  Naming lambdas is actually against PEP 8, the Python style guide.  Instead, use a def line.  If not for the reasons above, using def makes it easier to search for it.  If I want to search for a function  definition, I search for "def function_name(".  It would be hard to remember which functions were defined formally, and which were lambdas.