如何编写具有多行的Python Lambda表达式?

76
在Python中,如何编写一个多行的lambda函数?我尝试过。
d = lambda x: if x:
                 return 1
              else 
                 return 2

但是我遇到了错误...


9
如果你要给它命名,只需使用正确的def语句。 - JBernardo
8
这是 Python 中最糟糕的两件事之一:另一件是缺乏以任何明智/可读的方式链式处理集合的能力。解决方法是使用“for 推导式”,但这仅限于可读性不超过两层的情况。 - WestCoastProjects
3个回答

87

使用def代替。

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

所有Python函数都是一级对象(它们可以作为参数传递),lambda只是一种方便的方式来创建短函数。通常,如果函数变得不止一行简单代码,则最好使用正常的函数定义。

实际上,即使您将其分配给名称,如果超过一行,请始终使用def而不是lambdalambda仅在定义短key函数时才是一个好主意,例如用于sorted(),因为它们可以直接嵌入到函数调用中。

请注意,对于您的情况,三元运算符会完成任务(lambda x:1 if x else 2),但我假设这是一个简化的情况。

(作为代码高尔夫笔记,这也可以通过lambda x:bool(x)+1用更少的代码完成-当然,那非常难读并且是个坏主意。)


14
对于这个难以读懂的高尔夫比赛,我更喜欢"-~bool(x)",但字符数相同 :) - JBernardo
6
@JBernardo 先前我以为这已经是最难懂的了,向您脱帽致敬。 - Gareth Latty
11
def不能与逻辑代码放在一起,必须单独存在。这会打乱读取代码的流程。但这是我们在Python中所面对的。 - WestCoastProjects

39

lambda表达式在Python中仅限于一个表达式, 不允许使用语句。

当保持上述约束条件时,您可以使用反斜杠字符编写多行表达式:

>>> fn = lambda x: 1 if x \
                     else 2
>>> fn(True)
>>> 1
>>> fn(False)
>>> 2

-8

这是你尝试做的正确版本:

d = lambda x: 1 if x else 2

但我不确定你为什么要这样做。


14
这并没有回答标题中所问的问题。 - Martin Quinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接