带有 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 < 3
之类的东西比x for x in data if x [...]
之类的东西更不重复/更优雅。
欢迎您!但是您的 Python3 实现不正确。您会在列表中获得一个过滤器对象。您需要转换它:list(filter(lambda, data))
或使用 splat:[*filter(lambda x: x < 3, data)]
。这也不是列表理解。【参考方案3】:
lambda x: x if x < 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 按钮