有没有办法在python的lambda中执行“如果”


358

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

这显然不是语法。是否可以执行ifin lambda,如果可以,该怎么做?

谢谢


2
您不能打印或抬高lambda。Lambda只是函数,您可以始终使用函数代替。
Lennart Regebro 09年

10
恕我不能赞同。我需要4个不同的,非常短的函数(例如上面的一个),需要将它们放在列表/字典中,以便我可以对其进行迭代并选择在每次迭代中使用的函数。在迭代之前,我可以将其简化为仅4行init代码,而不是只是init的多行代码。越少越快乐..
Guy

5
当其他人必须阅读,解释,理解和维护代码时,4行代码不是一个值得称赞的解决方案。此外,示例中的“打印/凸起”问题表明了这一点,该问题不能而且不应该在lambda中完成。
S.Lott

@LennartRegebro lambdas不是python中的函数,它们只是表达式,这就是为什么您不能使用它们做很多事情的原因。
亚伦·麦克米林

1
@AaronMcMillin Lambdas是函数。由于语法原因,它们仅限于表达式,但它们是函数。
Lennart Regebro '16

Answers:


660

您要寻找的语法:

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

但是您不能使用printraise使用lambda。


33
在python 3中,您可以使用print
递归

11
可以,但是问题是“如何if在lambda中使用?” 不是“写一个如果一个偶数返回True的lambda的最佳方法是什么?”
罗伯特·罗斯尼

99
这是一种可怕的语法-可能是最糟糕的Python语言构造,在乱序的评估中接近了Perl的荒谬程度-但这正是所要的。您正在认真否决正确答案吗?
格伦·梅纳德

41
这是“如何编写一个告诉我数字是否为偶数的lambda函数”问题的正确答案。但是,这不是OP最初提出的问题的正确答案。无论您多么不喜欢我设计的示例,实际上我的帖子确实清楚地回答了OP的问题。
罗伯特·罗斯尼

10
令人痛苦的是,任何人建议“ x%2 == 0”(或投票赞成该建议,至少有7个人)甚至都没有读过原始问题。
格伦·梅纳德

40

为什么不只是定义一个函数?

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

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


3
print在2.6中还不是功能。:)
卢卡斯·拉林斯基

7
@LukášLalinský:它仍然适用于2.x。它会被视为一对多余的括号
newacct

24
您不知道他的实际用例,因此您无法说没有理由使用lambda。
格伦·梅纳德

6
@Glenn Maynard:几乎没有理由使用lambda句号。将lambda分配给变量(作为替身def)通常是一个非常糟糕的主意(tm)。仅仅使用一个def凡人的程序员就可以阅读,解释,理解和维护它。
S.Lott

17
lambda有很多合法用途。如果您什么也想不到,那不是lambda的错。(当然,我不喜欢语法本身,这是一个笨拙的解决方法,因为Python的缩进语法很难理解,无法像普通语言一样处理内联函数。)
Glenn Maynard,2009年

25

到目前为止,我可能写的最糟糕的python行:

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

如果您打印x == 2,

如果x!= 2,则加注。


荣誉,我认为这是页面上唯一可以实际回答这个问题的答案
theEpsilon

22

如果您确实要这样做,则可以在lambda中轻松引发异常。

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

这是一个好主意吗?我的本能通常是将错误报告放在lambda之外。使其值为None并在调用方中引发错误。不过,我不认为这从本质上讲是邪恶的-我认为“ y if x else z”语法本身更糟-只需确保您没有试图将过多内容放入lambda主体即可。


1
如果您问我,在呼叫者中举起它可能是更漂亮的方法。
多米尼克·布·萨姆拉

可能,但这在很大程度上取决于特定情况。当然,您也可以在创建lambda之后对其进行装饰。 x = RaiseValueErrorOnNone(x),视情况而定。
格伦·梅纳德

15

就允许使用的内容而言,Python中的Lambda相当严格。特别是,你不能有任何关键字(除了运营商喜欢andnotor,等)在他们的身上。

因此,您无法在示例中使用lambda(因为您无法使用raise),但是如果您愿意就此作答,则可以使用:

f = lambda x: x == 2 and x or None

16
lambda的特定限制是不允许您使用语句,而只能使用表达式。
Daniel Werner

13

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

f = lambda x: 1 if x>0 else 0 if x ==0 else -1


2

您还可以使用逻辑运算符来进行类似条件运算的操作

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

您可以在此处查看有关逻辑运算符的更多信息


就清晰度而言,它与python的哲学不符。即使在逻辑上等效,但if始终首选语法。检查条件的明显方法。
0xc0de

谢谢!由于大学教授施加的限制(我说我不能使用if陈述),所以我在大学的一种功能语言作品中使用了此功能,因此我发现这种方式并不明显
维克多·卢卡斯



0

以下示例代码对我有用。不知道它是否与这个问题直接相关,但希望在其他情况下有帮助。

a = ''.join(map(lambda x: str(x*2) if x%2==0 else "", range(10)))


0

在lambda中执行if的一种简单方法是使用列表理解。

您不能在lambda中引发异常,但这是Python 3.x中一种类似于您的示例的方式:

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

另一个例子:

如果M则返回1,否则返回0

f = lambda x: 1 if x=="M" else 0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.