有没有办法在python的lambda中执行"if"

Guy*_*Guy 328 python lambda python-2.6

python 2.6中,我想做:

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

这显然不是语法.是否有可能执行ifin lambda和if if how to do it?

谢谢

Rob*_*ney 618

您正在寻找的语法:

lambda x: True if x % 2 == 0 else False
Run Code Online (Sandbox Code Playgroud)

但你不能使用printraise在lambda中.

  • 这是一种可怕的语法 - 很容易就是最糟糕的Python语言结构,在其无序评估中接近Perl的荒谬程度 - 但这就是所要求的.你是否认真对待答案是正确的? (97认同)
  • -1:如果表达式为False,则为真,这是非常可怕的. (88认同)
  • 这是"如何编写lambda函数,告诉我数字是否均匀?"这个问题的正确答案.然而,这不是OP最初提出的问题的正确答案.无论你多么不喜欢我设计的例子,我的帖子*确实*,实际上,清楚地回答了OP的问题. (40认同)
  • 在python 3中,您可以使用print (30认同)
  • 当然,问题是"如何在lambda中使用`if`?" 不是"如果一个数字是偶数,写一个返回True的lambda的最佳方法是什么?" (10认同)
  • 很明显,任何人建议"x%2 == 0" - 或投票推荐它的评论,至少有七个人 - 甚至没有阅读原始问题. (10认同)
  • @Glenn Maynard:这不是令人恐惧的语法.它是"True如果表达式为False"形式的任何表达式."if"结构完全是多余的,因此深刻而恐怖地令人困惑.它与语句形式一样糟糕:`if expression:return True`. (8认同)
  • 好吧,如果一个聪明的人无法意识到这是问题的正确答案,这完全是关于语法的,那肯定会让人感到困惑.我很遗憾我的例子显然让你感到恐惧.随意构建一个更合适的. (8认同)
  • @Robert Rossney:如果表达其他False,那么真正的冗余是令人恐惧的.正确的形式由@unutbu显示:`lambda x:x%2 == 0`.在这个提法中,没有可怕的"如果真的那么真假". (5认同)

Sil*_*ost 40

你为什么不定义一个函数?

def f(x):
    if x == 2:
        print(x)
    else:
        raise ValueError
Run Code Online (Sandbox Code Playgroud)

在这种情况下,确实没有理由使用lambda.

  • 你不知道他的实际用例,所以你无法说没有理由使用lambda. (22认同)
  • lambda有很多合法用途.如果你想不出任何问题,那就不是lambda的错.(当然,我不是语法本身的粉丝 - 这是一个笨拙的解决方法,因为Python的构思不好的缩进语法无法处理像普通语言这样的内联函数.) (16认同)
  • @LukášLalinský:它仍然适用于2.x. 它将被视为一对冗余的括号 (7认同)
  • @Glenn Maynard:几乎没有理由使用lambda,句号.将lambda分配给变量 - 作为`def`的替身 - 通常是一个非常不好的想法(tm).只需使用`def`,所以凡人致命的程序员都可以阅读,解释,理解和维护它. (6认同)
  • `print`不是2.6中的函数.:) (3认同)
  • 如果您出于某种原因需要在运行时动态构造短函数或对象工厂,则 lambda 最有用。在后一种情况下,可能比“deecopy”更好。 (2认同)

Gle*_*ard 22

你可以轻松地在lambda中引发一个异常,如果那是你真正想做的事情.

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

这是一个好主意吗?我的直觉一般是将错误报告从lambdas中删除; 让它的值为None并在调用者中引发错误.我不认为这本质上是邪恶的 - 我认为"y if x else z"语法本身更糟 - 只是确保你不要试图在lambda体内填充太多东西.


jim*_*iki 22

可能是我到目前为止写的最糟糕的python系列:

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

如果你打印x == 2,

如果x!= 2你加注.

  • 荣誉,我认为这是页面上真正回答问题的唯一答案 (4认同)
  • 这真是太美了,谢谢你的回答。 (2认同)

Dav*_*ver 14

Python中的Lambdas对于您允许使用的内容具有相当的限制性.特别是,你不能有任何关键字(除了像运营商and,not,or等),在他们的身上.

所以,你无法使用lambda作为你的例子(因为你不能使用raise),但是如果你愿意承认...你可以使用:

f = lambda x: x == 2 and x or None
Run Code Online (Sandbox Code Playgroud)

  • lambda的具体限制是不允许使用语句,只允许使用表达式. (16认同)

小智 9

请注意,您可以在lambda定义中使用其他几个... if语句:

f = lambda x: 1 if x>0 else 0 if x ==0 else -1
Run Code Online (Sandbox Code Playgroud)