很抱歉,是否曾经有人问过这个问题,但我什么地方都看不到。
基本上,我遇到了一种情况,我需要在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函数存储在数组中,并在需要时进行访问,每个数组元素对应于一个特定的“比率”,因此对于同一“比率”具有两个单独的行将使事情变得混乱。任何帮助将不胜感激,或者,如果不可能的话,别人的一些确认将是不错的:)
使用exp1 if cond else exp2
语法。
rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T)
注意,您在lambda表达式中不要使用return
。
正确的方法很简单:
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
是,可以对exec
语句使用简写语法。
exec my_function_string in my_globals, my_locals
请注意,您也不会在if
中使用显式的rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t))
语句。
我发现我可以在lambda中使用“ if-then”语句。例如:
return
当您说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,
}
当def功能存在时为什么要费劲.....