python中一行lambda函数中的条件语句?

Nat*_*ush 57 python lambda if-statement ternary-operator conditional-operator

如果以前曾经问过这个问题,我会道歉,但我无法在任何地方看到它.

基本上我遇到过一个场景,我需要在lambda函数中使用if语句.困难之处在于理想情况下它需要在一行代码中(如果可能的话甚至可能?)

通常,我会这样写:

T = 250

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

return (rate)
Run Code Online (Sandbox Code Playgroud)

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

rate = lambda(T) : if (T>200): return(200*exp(-T)); else: return(400*exp(-T))
Run Code Online (Sandbox Code Playgroud)

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

shx*_*hx2 84

使用exp1 if cond else exp2语法.

rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T)
Run Code Online (Sandbox Code Playgroud)

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


aba*_*ert 20

正确的方法很简单:

def rate(T):
    if (T > 200):
        return 200*exp(-T)
    else:
        return 400*exp(-T)
Run Code Online (Sandbox Code Playgroud)

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

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


来自评论:

那么函数需要适合一行,我认为你不能用命名函数做?

我无法想象为什么函数需要适合一行的任何理由.但可以肯定的是,你可以使用命名函数来做到这一点.在翻译中尝试这个:

>>> def foo(x): return x + 1
Run Code Online (Sandbox Code Playgroud)

这些函数也存储为字符串,然后使用"eval"进行评估,我不知道如何处理常规函数.

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

但是,如果你真的需要这个,那么就这样:只需使用exec而不是eval.

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

exec(my_function_string, my_globals, my_locals)
Run Code Online (Sandbox Code Playgroud)

在2.7中,exec是一个语句,而不是一个函数 - 但你仍然可以用与3.x中相同的语法编写它(只要你不尝试将返回值赋给任何东西)它就可以工作.

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

exec my_function_string in my_globals, my_locals
Run Code Online (Sandbox Code Playgroud)


Sil*_*Ray 7

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

rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t))
Run Code Online (Sandbox Code Playgroud)

请注意,您也不要returnlambdas中使用显式语句.

  • "lambda"之后的parens也是多余的. (3认同)
  • 进一步缩短:`rate = lambda(t):(如果t> 200则为200,否则为400)*exp(-t)` (2认同)

tde*_*ney 5

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

lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T))
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现我可以在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,
}
Run Code Online (Sandbox Code Playgroud)