529

In Python 2.6, I want to do:

f = lambda x: if x==2 print x else raise Exception()
f(2) #should print "2"
f(3) #should throw an exception

This clearly isn't the syntax. Is it possible to perform an if in lambda and if so how to do it?

Karl Knechtel
61.5k14 gold badges134 silver badges194 bronze badges
asked Oct 18, 2009 at 16:28
6
  • 3
    You can't print or raise in a lambda. Lambdas are just functions, you can alwaya use a function instead. Commented Oct 18, 2009 at 17:36
  • 11
    I disagree with you. I need 4 different, very short functions like the one above that need to be put in a list/dictionary so I can iterate over them and select which ones to use in each iteration. Instead of many lines of code of just inits, before the iteration, itself I can bring it down to only 4 lines of init code. The less the merrier.. Commented Oct 18, 2009 at 21:20
  • 6
    4 lines of code is not a laudable solution when other people have to read, interpret, understand and maintain the code. Further, the "print/raise" problem in the example shows this which cannot and should not be done in lambdas. Commented Oct 18, 2009 at 22:12
  • @LennartRegebro lambdas are not functions in python, they are only expressions, that is why there are many things you can not do with them. Commented Aug 11, 2016 at 15:35
  • 3
    @AaronMcMillin Lambdas are functions. They are restricted to expressions for syntax reasons, but they ARE functions. Commented Aug 17, 2016 at 10:06

16 Answers 16

912

The syntax you're looking for:

lambda x: True if x % 2 == 0 else False

But you can't use print or raise in a lambda.

answered Oct 18, 2009 at 16:48
Sign up to request clarification or add additional context in comments.

11 Comments

in python 3, you can use print
It's a horrible syntax--easily the worst Python language construct, approaching Perl levels of absurdity in its out-of-order evaluation--but it's what was asked for. You're seriously voting down answers for being correct?
@Glenn Maynard: it's not the syntax that horrifying. It's any expression of the form True if expression else False. The if construct is totally redundant and therefore deeply and horrifyingly confusing. It's as bad as the statement form: if expression: return True.
It's the correct answer to the question "How do I write a lambda function that tells me if a number is even?" It is not, however, a correct answer to the question that the OP originally asked. However much you don't like the example I contrived, my post does, in fact, clearly answer the OP's question.
It's painfully obvious that anyone suggesting "x%2==0"--or voting up a comment recommending it, which makes at least seven people--didn't even read the original question.
|
49

why don't you just define a function?

def f(x):
 if x == 2:
 print(x)
 else:
 raise ValueError

there really is no justification to use lambda in this case.

answered Oct 18, 2009 at 16:33

7 Comments

print is not a function in 2.6 yet. :)
@Lukáš Lalinský: it still works in 2.x. it will be treated as a pair of redundant parentheses
You don't know his actual use case, so there's no way you can say there's no reason to use a lambda.
@Glenn Maynard: There's almost no reason to use a lambda, period. Assigning a lambda to a variable -- as a stand-in for def -- is generally a Very Bad Idea (tm). Just use a def so mere mortal programmers can read, interpret, understand and maintain it.
There are plenty of legitimate uses of lambdas. If you can't think of any, then that's not lambda's fault. (I'm not a fan of the syntax itself, of course--it's a clumsy workaround for the fact that Python's poorly-conceived indentation syntax can't handle inline functions like normal languages.)
|
44

Probably the worst python line I've written so far:

f = lambda x: sys.stdout.write(["2\n",][2*(x==2)-2])

If x == 2 you print,

if x != 2 you raise.

answered Oct 21, 2015 at 5:43

Comments

29

You can easily raise an exception in a lambda, if that's what you really want to do.

def Raise(exception):
 raise exception
x = lambda y: 1 if y < 2 else Raise(ValueError("invalid value"))

Is this a good idea? My instinct in general is to leave the error reporting out of lambdas; let it have a value of None and raise the error in the caller. I don't think this is inherently evil, though--I consider the "y if x else z" syntax itself worse--just make sure you're not trying to stuff too much into a lambda body.

answered Oct 18, 2009 at 21:48

1 Comment

Possibly, but it depends heavily on the particular case. Of course, you can also decorate the lambda after creating it. x = RaiseValueErrorOnNone(x), again, depending on the case.
21

note you can use several else...if statements in your lambda definition:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1
answered Nov 22, 2016 at 14:38

Comments

17

Lambdas in Python are fairly restrictive with regard to what you're allowed to use. Specifically, you can't have any keywords (except for operators like and, not, or, etc) in their body.

So, there's no way you could use a lambda for your example (because you can't use raise), but if you're willing to concede on that... You could use:

f = lambda x: x == 2 and x or None
answered Oct 18, 2009 at 16:31

2 Comments

lambda's specific restriction is that you are not allowed to use statements, only expressions.
Aren't lambdas meant to be short and concise else won't you write a separate function anyway?
5

This snippet should help you:

x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Robert Columbia
6,45215 gold badges34 silver badges42 bronze badges
answered Dec 16, 2018 at 13:16

Comments

3

If you still want to print you can import future module

from __future__ import print_function
f = lambda x: print(x) if x%2 == 0 else False
answered Apr 7, 2017 at 20:25

Comments

3

You can also use Logical Operators to have something like a Conditional

func = lambda element: (expression and DoSomething) or DoSomethingIfExpressionIsFalse

You can see more about Logical Operators here

answered Jun 12, 2018 at 22:41

2 Comments

It doesn't go with python's philosophy in terms of clarity. Even though logically equivalent, the if syntax is always preferred over this. The obvious way of checking conditions.
Thank you! I used this in a work of functional language in college because of restrictions that the professor has imposed who says that I couldn't use if statement, so I found this not obvious way.
2

An easy way to perform an if in lambda is by using list comprehension.

You can't raise an exception in lambda, but this is a way in Python 3.x to do something close to your example:

f = lambda x: print(x) if x==2 else print("exception")

Another example:

return 1 if M otherwise 0

f = lambda x: 1 if x=="M" else 0
answered Feb 17, 2020 at 6:43

1 Comment

The question was specifically about Python 2.6, not 3.x.
1

what you need exactly is

def fun():
 raise Exception()
f = lambda x:print x if x==2 else fun()

now call the function the way you need

f(2)
f(3)
answered Oct 9, 2018 at 13:57

1 Comment

This gives SyntaxError: invalid syntax. I've tested this in Python 2.7 since I don't have Python 2.6 installed, but I really can't imagine this is valid in Python 2.6, since you can't use print in a lambda expression.
1

the solution for the given scenerio is:

f = lambda x : x if x == 2 else print("number is not 2")
f(30) # number is not 2
f(2) #2
answered Aug 13, 2020 at 7:49

1 Comment

This is valid in Python 3.x, but the question was about Python 2.6. In Python 2.x this answer is not correct.
1

Here's the solution if you use Python 3.x!

>>> f = lambda x: print(x) if x == 2 else print("ERROR")
>>> f(23)
ERROR
>>> f(2)
2
>>> 
Rustam-Z
1131 silver badge9 bronze badges
answered Jul 27, 2020 at 15:10

1 Comment

This is valid in Python 3.x, but the question was about Python 2.6. In Python 2.x this answer does not work, since you can't use print in a lambda expression.
0

Following sample code works for me. Not sure if it directly relates to this question, but hope it helps in some other cases.

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))
answered Aug 4, 2018 at 3:51

Comments

0

Hope this will help a little

you can resolve this problem in the following way

f = lambda x: x==2 
if f(3):
 print("do logic")
else:
 print("another logic")
answered Jul 27, 2020 at 12:00

Comments

0

it might be worth considering np.where

answered Aug 22, 2022 at 14:33

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.