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?
-
3You can't print or raise in a lambda. Lambdas are just functions, you can alwaya use a function instead.Lennart Regebro– Lennart Regebro2009年10月18日 17:36:04 +00:00Commented Oct 18, 2009 at 17:36
-
11I 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..Guy– Guy2009年10月18日 21:20:45 +00:00Commented Oct 18, 2009 at 21:20
-
64 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.S.Lott– S.Lott2009年10月18日 22:12:52 +00:00Commented 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.Aaron McMillin– Aaron McMillin2016年08月11日 15:35:10 +00:00Commented Aug 11, 2016 at 15:35
-
3@AaronMcMillin Lambdas are functions. They are restricted to expressions for syntax reasons, but they ARE functions.Lennart Regebro– Lennart Regebro2016年08月17日 10:06:31 +00:00Commented Aug 17, 2016 at 10:06
16 Answers 16
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.
11 Comments
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.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.
7 Comments
print is not a function in 2.6 yet. :)def -- is generally a Very Bad Idea (tm). Just use a def so mere mortal programmers can read, interpret, understand and maintain it.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.
Comments
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.
1 Comment
x = RaiseValueErrorOnNone(x), again, depending on the case.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
Comments
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
2 Comments
This snippet should help you:
x = lambda age: 'Older' if age > 30 else 'Younger'
print(x(40))
Comments
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
Comments
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
2 Comments
if syntax is always preferred over this. The obvious way of checking conditions.if statement, so I found this not obvious way.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
1 Comment
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)
1 Comment
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.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
1 Comment
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
>>>
1 Comment
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)))
Comments
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")