

Python does support if-else in lambdas... - globalrev

Just learned some tricks in #python in IRC-freenode:<p>I have heard a lot of complaints about Pythons lambdas being crippled but Python does allow if-else in lambdas, I didn't know before. 
Not in the ordinary Python way but:<p>f = lambda n_: (lambda ns: ns.__setitem__('f', lambda n: n if n in [0, 1] else \
            fib(n-1) + fib(n - 2)) or ns['f'](n_))({})<p>map(lambda n: n<i></i>3 if n % 2 == 1 else n<i></i>2, range(10))<p>&#62;&#62;&#62; reduce(lambda x,y: x+y if y % 2 == 1 else x-y, [1,2,3,4,5])
3<p>&#62;&#62;&#62; fib = lambda n: n if n in [0, 1] else fib(n-1) + fib(n - 2)
&#62;&#62;&#62; fib(12)
144<p>also:
[n<i></i>3 if n%2 else n<i></i>2 for n in range(10)]<p>For soem reason * * disappears if next to each other.
======
kaens
That's the normal python idiom for the ternary operator in other languages if
I'm not mistaken. Its lambdas are still crippled, for the same reasons people
called them crippled before, which is fine for python, IMO.

If I recall correctly, the if...else for ternary was added mainly because
people were doing stuff with and...or to achieve the same effect.

~~~
thomasmallen
I don't think there's anything wrong with the idiom

    
    
      condition and trueaction or falseaction
    

Am I behind the times? On a separate note, the code in the examples above is
very difficult to read...a lambda really shouldn't be doing if/else operations
like these in my opinion.

~~~
myelin
The danger here is that this will fall through to the falseaction if
trueaction returns a false result ("", False, 0, None, [], {}, etc). For
example, this will evaluate to "etc":

    
    
      True and "" or "etc"
    

So people started doing this instead, as [False] is still 'true' (non-empty
lists are 'true' in Python):

    
    
      (condition and [trueaction] or [falseaction])[0]
    

... which is a bit crufty. So this was added:

    
    
      trueaction if condition else falseaction

~~~
thomasmallen
Ah, that is much better. I've been learning from _Dive Into Python_ which I
know is a tad dated, and Pilgrim (sort of) endorses the and...or method.

------
thomasmallen
* * disappears because those are for italizicing text here. Obviously they should really only be hidden if they're surrounding something.

------
tzury
That's the way I write these if..else statements fib = lambda n: n in [0, 1]
and n or fib(n-1) + fib(n - 2)

