使用Lambda代替“if”语句

2 投票
5 回答
19768 浏览
提问于 2025-04-16 23:41

我听说可以用一个叫做 lambda 的东西来替代 if 语句。

在Python中可以这样做吗?如果可以的话,怎么做呢?

5 个回答

3

我可能理解错了,但我想这大概是说:

filter(lambda x: x > 0, list_of_values)

这段代码会给你返回list_of_values中所有大于0的元素。

6

也许你是在说像这样的东西(λ演算)?

If = lambda test, x, y: test(x, y)
True = lambda x, y: x
False = lambda x, y: y

你可以像这样使用它...

# I guess you have to convert them sometimes... oh well
C = lambda b: [False, True][b]

x = If(C(2 > 3), "Greater", "Less")
print(x)
# "Less"

但是现在事情开始变得复杂了...

If(C(2 > 3), print("Greater"), print("Less"))
# Invalid syntax unless you use
    #     from __future__ import print_function
# And if you do, it prints both!
# (Because python has eager evaluation)

# So we could do
True = lambda x, y: x()
False = lambda x, y: y()

# And then
If(C(2 > 3), lambda:print("Greater"), lambda:print("Less"))
# "Less"

所以,这样看起来不太好,也不太实用。不过它确实能工作。

4

和其他人一样,我不太确定你在问什么,但我愿意猜一猜。

我有时候会用一种稍微“黑科技”的方式来处理API调用的结果。

比如说,API调用的结果中有一个元素应该是一个数字字符串,我想把它转成整数,但有时候它返回的却不是这个。

你可以定义一个lambda表达式,把字符串转换成整数,前提是这个字符串是由数字组成的:

lambda x: x and x.isdigit() and int(x) or None

这样做可以避免使用if语句,但这并不是因为lambda的原因,你也可以用一个普通的函数来实现:

def f(x):
  return x and x.isdigit() and int(x) or None

更新

这是一个更少bug的黑科技,感谢Paul McGuire:

lambda x: int(x) if x and x.isdigit() else None

也就是说,像int('0')返回的结果相当于False,这个lambda可能会让你惊讶,因为它返回None而不是你想要的0

撰写回答