Lambda而不是“if”语句

时间:2011-08-16 10:22:51

标签: python lambda if-statement lambda-calculus

我听说可以使用lambda替换if语句。

这在Python中可行吗?如果是这样,怎么样?

5 个答案:

答案 0 :(得分:6)

也许你指的是这样的东西(Lambda calculus)?

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"

所以,不那么漂亮或有用。但它确实有效。

答案 1 :(得分:4)

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

我有时会以一种hacky方式使用lambdas来处理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

<强>更新

保罗·麦克奎尔(Paul McGuire)提供的不那么错误的黑客攻击:

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

即。当int('0')返回相当于False时,lambda可能会在您想要None

时返回0而让您感到惊讶

答案 2 :(得分:3)

我可能会认真对待,但我想这意味着:

filter(lambda x: x > 0, list_of_values)

会返回list_of_values中值大于0的元素。

答案 3 :(得分:1)

以下是Smalltalk启发的一个小技巧 语言核心,不使用if语句或三元语言 运算符,但作为条件执行 机制。 : - )

#!/usr/bin/env python
class ATrue:
  def ifThen(self,iftrue): iftrue()
  def ifThenElse(self,iftrue,iffalse): return iftrue()
  def andThen(self,other): return other()
  def orElse(self,other): return self

class AFalse:
  def ifThen(self,iftrue): pass
  def ifThenElse(self,iftrue,iffalse): return iffalse()
  def andThen(self,other): return self
  def orElse(self,other): return other()

def echo(x): print x

if __name__=='__main__':
  T = ATrue()
  F = AFalse()

  x = T                    # True
  y = T.andThen(lambda: F) # True and False
  z = T.orElse(lambda: F)  # True or False

  x.ifThenElse( lambda: echo("x is True"), lambda: echo("x if False"))
  y.ifThenElse( lambda: echo("y is True"), lambda: echo("y if False"))
  z.ifThenElse( lambda: echo("z is True"), lambda: echo("z if False"))

更新:整理一些符号以避免混淆并明确指出。并添加了代码,以显示如何实现逻辑运算符的快捷评估。

答案 4 :(得分:0)

if condition:
    do_stuff()
else:
    dont()

(lambda x: do_stuff() if x else dont())(condition)

但目前尚不清楚你在寻找什么。

请注意,这是 if声明 - 它是ternary operation。在Python中,他们只使用单词if。例如,请参阅C#中的Lambda "if" statement?