Credit: Anurag Uniyal
You want to write a
recursive function, such as a factorial, using
lambda
(you probably made a bet about whether it
could be done).
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
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!
Recipe 17.6 for other ways to simulate the ternary operator.