抱歉,如果有人问过这个问题,但我在任何地方都看不到它。
基本上,我遇到过一个场景,我需要在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函数存储在一个数组中,需要时可以访问,其中每个阵列元素对应于特定的“速率”,因此对于相同的“速率”具有两个单独的行将使事情变得混乱。任何帮助都将非常感谢,或者如果不可能,一些其他人的确认将是很好的:)
7条答案
按热度按时间2izufjch1#
使用
exp1 if cond else exp2
语法。注意,在lambda表达式中不要使用
return
。1rhkuytd2#
正确的方法很简单:
在这里使用
lambda
绝对没有任何优势。lambda
唯一的好处是允许你创建匿名函数并在表达式中使用它们(而不是语句)。如果你立即将lambda
赋值给一个变量,它就不再是匿名的,而是在语句中使用,所以你只是无缘无故地降低了代码的可读性。用这种方式定义的
rate
函数可以存储在数组中,传递,调用等等,就像lambda函数一样,完全一样(除了更容易调试,自省等等)。来自评论:
这个函数需要在一行中,我不认为你可以用一个命名函数来做这件事?
我想不出有什么好的理由来解释为什么函数需要占满一行,但是可以肯定的是,你可以用一个命名函数做到这一点,在你的解释器中试试这个:
这些函数也存储为字符串,然后使用“eval”进行计算,我不知道如何处理常规函数。
同样,虽然很难100%确定你为什么要这么做,但我至少99%确定你没有理由这么做,或者理由很糟糕。几乎任何时候,你认为你想把Python函数作为字符串传递,然后调用
eval
,这样你就可以使用它们,实际上你只是想把Python函数作为函数传递,然后把它们作为函数使用。但万一这就是你需要的:只需使用
exec
而不是eval
。你没有提到你使用的是哪个版本的Python,在Python 3.x中,
exec
函数和eval
函数有着完全相同的签名:在Python 2.7中,
exec
是一个语句,而不是函数--但是你仍然可以用Python 3.x中的语法来编写它(只要你不试图将返回值赋给任何东西),并且它可以工作。在早期的2.x中(我想是2.6之前的版本吧?),你必须这样做:
lkaoscv73#
可以,您可以使用
if
语句的简写语法。注意,在
lambda
中也不要使用显式的return
语句。icnyk63a4#
我发现我可以在lambda中使用“if-then”语句,例如:
xurqigkl5#
当你说
rate = lambda whatever...
的时候,你已经击败了lambda的要点,应该只定义一个函数。但是,如果你想要一个lambda,你可以使用'and'和'or'wpcxdonn6#
如果你想变得更懒:
在您的情况下:
nzk0hqpo7#
使用元组切片具有副作用:元组中的bothof condition将被求值为first,然后括号中的表达式被求值为任意值,其中
False
选择前者,True
选择后者。由于自调用函数(递归)大多需要先求尾部递归条件,这种先求后选的方法可能会导致无穷递归,从而引发
RecursionError
。对于问题本身(Y问题),请参见Python有三元条件运算符吗?