【发布时间】: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 似乎是我找到的最接近的。
【问题讨论】:
我正在编写一些 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 似乎是我找到的最接近的。
【问题讨论】:
与任何函数一样,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]
【讨论】:
lambda x: 后面的内容必须是表达式,而不是语句。
lambda 就像它实际上写成def lambda(x, y): return ... 一样方便
我发现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]
【讨论】:
list(filter(lambda, data))。无论哪种方式,通常认为使用if 子句(如unutbu's answer)更容易阅读理解。
x: x < 3 之类的东西比x for x in data if x [...] 之类的东西更不重复/更优雅。
list(filter(lambda, data)) 或使用 splat:[*filter(lambda x: x < 3, data)]。这也不是列表理解。
lambda x: x if x < 3 else None 有什么问题?
【讨论】:
lambda 将返回 None。它必须返回 something.
您始终可以尝试调用“过滤器”进行条件检查。从根本上说,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)
【讨论】: