if in expression

Diez B. Roggisch deets at nospam.web.de
Mon Aug 18 10:37:11 CEST 2008

Hrvoje Niksic schrieb:
> "Diez B. Roggisch" <deets at nospam.web.de> writes:
>> Since python 2.5, it is
>> <then_value> if <cond> else <else_value>
>> If you want lazy evaluation, you can use lambdas:
>> iif(cond, lambda: then, lambda: else_)()
> Your code uses "iif" and attempts to evaluate a tuple; could you post
> an example that works?

> I ask because it's not clear what you mean by lazy evaluation in this
> context.  The ternary "if" expression introduced in Python 2.5 only
> evaluates then_value or else_value depending on the outcome of cond.
> How is that different than using a lambda?

If iif is defined as this:

def iif(cond, then, else_):
     if cond:
        return then
        return else_

you have the problem that "then" and "else_" get evaluated *before* they 
  get passed. So for example this factorial function will fail with too 
deep recursion error:

def f(n):
    return iif(n> 1, n * f(n-1), 1)

But if you do it like this, the then and else_ will be functions that 
get returned and then they need to be called to be acutally evaluated:

def f(n):
    return iif(n> 1, lambda: n * f(n-1), lambda: 1)()


More information about the Python-list mailing list