Computing Factorials with lambda
Credit: Anurag Uniyal
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).
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
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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access