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

问题描述 投票:58回答:6

很抱歉,是否曾经有人问过这个问题,但我什么地方都看不到。

基本上,我遇到了一种情况,我需要在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函数存储在数组中,并在需要时进行访问,每个数组元素对应于一个特定的“比率”,因此对于同一“比率”具有两个单独的行将使事情变得混乱。任何帮助将不胜感激,或者,如果不可能的话,别人的一些确认将是不错的:)

python if-statement lambda ternary-operator conditional-operator
6个回答
85
投票

使用exp1 if cond else exp2语法。

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

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


20
投票

正确的方法很简单:

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”进行评估,我不确定如何使用常规函数。

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

但是,这确实是您真正需要的:仅使用exec而不是eval

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

eval

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

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

exec

7
投票

是,可以对exec语句使用简写语法。

exec my_function_string in my_globals, my_locals

请注意,您也不会在if中使用显式的rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t)) 语句。


5
投票

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

return

4
投票

当您说lambda时,您已经克服了lambda的问题,应该只定义一个函数。但是,如果您想使用lambda,则可以使用'and'和'or'

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,
}

0
投票

当def功能存在时为什么要费劲.....

© www.soinside.com 2019 - 2024. All rights reserved.