70

抱歉,如果以前有人问过这个问题,但我在任何地方都看不到。

基本上我遇到了一个场景,我需要在 lambda 函数中使用 if 语句。最困难的是理想情况下它需要在一行代码中(如果可能的话?)

通常,我会这样写:

T = 250

if (T > 200):
    rate = 200*exp(-T)
else:
    rate = 400*exp(-T)

return (rate)

但是我需要它看起来像这样:

rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T))

我意识到更容易做的事情是在 lambda 函数之外做出决策,然后为每种情况使用一个单独的 lambda 函数,但在这里并不适合。lambda 函数存储在一个数组中,并在需要时访问,每个数组元素对应一个特定的“速率”,因此对于相同的“速率”有两个单独的行会搞砸。任何帮助将不胜感激,或者如果不可能,其他人的一些确认会很好:)

4

6 回答 6

109

使用exp1 if cond else exp2语法。

rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T)

请注意,您不要return在 lambda 表达式中使用。

于 2013-04-02T19:27:55.623 回答
25

正确的方法很简单:

def rate(T):
    if (T > 200):
        return 200*exp(-T)
    else:
        return 400*exp(-T)

在这里使用绝对没有优势lambda。唯一的lambda好处是允许您创建匿名函数并在表达式中使用它们(而不是语句)。如果您立即将 分配lambda给一个变量,则它不再是匿名的,而是在语句中使用,因此您只是无缘无故地降低了代码的可读性。

以这种方式定义的rate函数可以以与 lambda 函数完全相同的方式存储在数组中、传递、调用等。它将完全相同(除了更容易调试、内省等)。


来自评论:

那么函数需要放在一行中,我认为您不能使用命名函数来做到这一点?

我无法想象为什么该函数需要放在一行中的任何充分理由。但可以肯定的是,您可以使用命名函数来做到这一点。在你的解释器中试试这个:

>>> def foo(x): return x + 1

这些函数也存储为字符串,然后使用“eval”进行评估,我不确定如何处理常规函数。

同样,虽然很难 100% 确定你为什么要这样做,但我至少 99% 确定你没有理由或不好的理由这样做。几乎任何时候你认为你想将 Python 函数作为字符串传递并调用eval以便你可以使用它们,你实际上只是想将 Python 函数作为函数传递并将它们作为函数使用。

但是如果这真的是你在这里需要的:只需使用exec而不是eval.

您没有提到您使用的是哪个版本的 Python。在 3.x 中,该exec函数具有与该函数完全相同的签名eval

exec(my_function_string, my_globals, my_locals)

在 2.7 中,exec是一个语句,而不是一个函数——但是您仍然可以使用与 3.x 中相同的语法来编写它(只要您不尝试将返回值分配给任何东西)并且它可以工作。

在早期的 2.x(我认为是 2.6 之前?)中,您必须这样做:

exec my_function_string in my_globals, my_locals
于 2013-04-02T19:45:37.240 回答
9

是的,您可以使用if语句的简写语法。

rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t))

请注意,您也不在s 中使用显式return语句。lambda

于 2013-04-02T19:28:26.767 回答
6

我发现我可以在 lambda 中使用“if-then”语句。例如:

eval_op = {
    '|'  : lambda x,y: eval(y) if (eval(x)==0) else eval(x),
    '&'  : lambda x,y: 0 if (eval(x)==0) else eval(y),
    '<'  : lambda x,y: 1 if (eval(x)<eval(y)) else 0,
    '>'  : lambda x,y: 1 if (eval(x)>eval(y)) else 0,
}
于 2013-10-05T23:32:43.063 回答
4

当你说rate = lambda whatever...你已经打败了 lambda 并且应该只定义一个函数时。但是,如果你想要一个 lambda,你可以使用 'and' 和 'or'

lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T))
于 2013-04-02T19:46:27.600 回答
3

如果你想更懒一点:

#syntax lambda x : (false,true)[Condition]

在你的情况下:

rate = lambda(T) : (400*exp(-T),200*exp(-T))[T>200]
于 2020-06-12T04:31:39.893 回答