17.10 Computing Factorials with lambda


Credit: Anurag Uniyal

17.10.1 Problem

You want to write a recursive function, such as a factorial, using lambda (you probably made a bet about whether it could be done).

17.10.2 Solution

Use a short-circuiting, ternary-operator idiom and, crucially, bind the lambda form to a name, so it can recurse:

f = lambda n: n-1 + abs(n-1) and f(n-1)*n or 1

17.10.3 Discussion

This recipe implements the recursive definition of the factorial function as a lambda form. Since lambda forms can only be expressions, this is slightly tricky, since if/else is a statement, and therefore not allowed inside an expression. Still, a short-circuiting form of a Python idiom for a conditional (ternary) operator takes care of that (see Recipe 17.6 for other ways to simulate the ternary operator, both with and without short-circuiting).

The real issue, of course, is that since lambda's forte is making anonymous functions, how then do we recurse? This question is what makes this recipe's subject a good bet to win a drink from your Python-using friends and acquaintances who are misguided enough that they have not yet read this book cover to cover.

Just make sure the terms of the bet mention only lambda and do not specify that the resulting function will be left unnamed. Some might consider this cheating, but we Python programmers are a bunch of pragmatists. Thus, we simply bind a name to the lambda form with an assignment statement, and in the body of the lambda itself, we use the name to which we will assign the lambda. Since the body executes only when the lambda is called (not at the time it's created), the name will be bound by the time we use it. And the bet is won!

17.10.4 See Also

Recipe 17.6 for other ways to simulate the ternary operator.



Python Cookbook
Python Cookbook
ISBN: 0596007973
EAN: 2147483647
Year: 2005
Pages: 346

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net