68

In python, how can you write a lambda function taking multiple lines. I tried

d = lambda x: if x:
                 return 1
              else 
                 return 2

but I am getting errors...

omega
  • 40,311
  • 81
  • 251
  • 474
  • 9
    If you are giving it a name, just use the proper `def` statement. – JBernardo Feb 12 '13 at 23:26
  • 7
    This is one of the two worst things in python: the other being the lack of ability to chain collections processing in any sane/readable manner. The workaround hack is the `for comprehensions: but those only are readable to two levels – WestCoastProjects Mar 28 '20 at 17:28

3 Answers3

81

Use def instead.

def d(x):
    if x:
        return 1
    else:
        return 2

All python functions are first order objects (they can be passed as arguments), lambda is just a convenient way to make short ones. In general, you are better off using a normal function definition if it becomes anything beyond one line of simple code.

Even then, in fact, if you are assigning it to a name, I would always use def over lambda. lambda is really only a good idea when defining short key functions, for use with sorted(), for example, as they can be placed inline into the function call.

Note that, in your case, a ternary operator would do the job (lambda x: 1 if x else 2), but I'm presuming this is a simplified case.

(As a code golf note, this could also be done in less code as lambda x: bool(x)+1 - of course, that's highly unreadable and a bad idea.)

Gareth Latty
  • 86,389
  • 17
  • 178
  • 183
38

lambda construct in Python is limited to an expression only, no statements are allowed

While keeping the above mentioned constraint, you can write an expression with multiple lines using backslash char, of course:

>>> fn = lambda x: 1 if x \
                     else 2
>>> fn(True)
>>> 1
>>> fn(False)
>>> 2
David Unric
  • 7,421
  • 1
  • 37
  • 65
-8

Here's a correct version of what you are trying to do:

d = lambda x: 1 if x else 2

But I am not sure why you want to do that.

K. Brafford
  • 3,755
  • 2
  • 26
  • 30