带有 if 但没有 else 的 Python lambda

Posted

技术标签:

【中文标题】带有 if 但没有 else 的 Python lambda【英文标题】:Python lambda with if but without else 【发布时间】:2012-09-24 09:57:04 【问题描述】:

我正在编写一些 lambda 函数,但无法弄清楚。有没有办法在 python 中有类似lambda x: x if (x<3) 的东西?正如lambda a,b: a if (a > b) else b 工作正常。到目前为止,lambda x: x < 3 and x or None 似乎是我找到的最接近的。

【问题讨论】:

【参考方案1】:

与任何函数一样,lambda 必须有一个返回值。

lambda x: x if (x<3) 不起作用,因为它没有指定如果不是 x<3 则返回什么。默认情况下函数返回None,所以你可以这样做

lambda x: x if (x<3) else None

但也许您正在寻找的是具有if 条件的列表理解。例如:

In [21]: data = [1, 2, 5, 10, -1]

In [22]: [x for x in data if x < 3]
Out[22]: [1, 2, -1]

【讨论】:

@ubuntu -- 谢谢。不知道为什么我认为它应该返回 None 而不指定它。 这是一个合理的假设,因为函数默认返回 None。重要的是要记住lambda x: 后面的内容必须是表达式,而不是语句。 @root 我有时觉得lambda 就像它实际上写成def lambda(x, y): return ... 一样方便【参考方案2】:

我发现filter 提供了我在 python 2 中寻找的内容:

>>> data = [1, 2, 5, 10, -1]
>>> filter(lambda x: x < 3, data)
[1, 2, -1]

2.x 和3.x 的实现不同:2.x 提供列表,3.x 提供迭代器。在 3.x 中使用 list comprehension 可能会更清洁:

>>> data = [1, 2, 5, 10, -1]
>>> [filter(lambda x: x < 3, data)]
[1, 2, -1]

【讨论】:

实现在 2 和 3 中相同。在 2 中它返回一个列表,在 3 中它返回一个迭代器,并且要将其放入列表中,您需要转换它:list(filter(lambda, data))。无论哪种方式,通常认为使用if 子句(如unutbu's answer)更容易阅读理解。 添加了您对 python 3 的意见,谢谢!我想风格的变化有点关于个人喜好。由于使用函数式编程语言,Lambda 对我来说感觉有点自然。当我阅读它们时,x: x &lt; 3 之类的东西比x for x in data if x [...] 之类的东西更不重复/更优雅。 欢迎您!但是您的 Python3 实现不正确。您会在列表中获得一个过滤器对象。您需要转换它:list(filter(lambda, data)) 或使用 splat:[*filter(lambda x: x &lt; 3, data)]。这也不是列表理解。【参考方案3】:

lambda x: x if x &lt; 3 else None 有什么问题?

【讨论】:

我的理解是列表理解更适合这种场景 这个问题没有提到迭代,所以我不确定你的意思。你能详细说明一下吗? 在 else 的情况下 x 的值为“None” @Mardini 否,但在这种情况下,lambda 将返回 None。它必须返回 something. @user4815162342 这正是我的意思,lambda 将返回“None”【参考方案4】:

您始终可以尝试调用“过滤器”进行条件检查。从根本上说,map() 必须处理每次出现的可迭代对象,因此它无法进行选择。但过滤器可能有助于缩小选择范围。例如,我创建了一个从 1 到 19 的列表,但想创建一个 of 仅由偶数平方组成的元组。

x = list(range(1,20))

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x)))

print (y)

【讨论】:

以上是关于带有 if 但没有 else 的 Python lambda的主要内容,如果未能解决你的问题,请参考以下文章

带有 If Else 语句的 Python Tkinter 按钮

带有嵌套 if/else 语句的 While 循环

PHP - If/else, for, foreach, while - 没有花括号?

if/else 三元表达式中的 def

在 C# 中使用带有多个 if 语句的 else

If & Else & SML 中的模式匹配?