如果以前曾经问过这个问题,请道歉,但我无法在任何地方看到它。
基本上我遇到过一个场景,我需要在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函数之外做出决策,然后为每个case都有一个单独的lambda函数,但它不适合这里。 lambda函数存储在一个数组中,并在需要时访问,每个数组元素对应一个特定的“速率”,因此对于相同的“速率”有两个单独的行会弄乱。任何帮助将不胜感激,或如果不可能,其他人的一些确认将很好:)
答案 0 :(得分:80)
使用exp1 if cond else exp2
语法。
rate = lambda T: 200*exp(-T) if T>200 else 400*exp(-T)
请注意,您不要在lambda表达式中使用return
。
答案 1 :(得分: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"进行评估。我不确定如何处理常规功能。
同样,虽然很难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
答案 2 :(得分:7)
是的,您可以使用if
语句的简写语法。
rate = lambda(t): (200 * exp(-t)) if t > 200 else (400 * exp(-t))
请注意,您不要在return
中使用明确的lambda
语句。
答案 3 :(得分: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,
}
答案 4 :(得分:3)
当你说rate = lambda whatever...
时,你已经击败了lambda的点并且应该只定义一个函数。但是,如果你想要一个lambda,你可以使用'and'和'或'
lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T))
答案 5 :(得分:1)
如果您想变得懒惰:
#syntax lambda x : (false,true)[Condition]
在您的情况下:
rate = lambda(T) : (400*exp(-T),200*exp(-T))[T>200]