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

kognpnkq  于 2023-01-29  发布在  Python
关注(0)|答案(7)|浏览(135)

抱歉,如果有人问过这个问题,但我在任何地方都看不到它。
基本上,我遇到过一个场景,我需要在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函数存储在一个数组中,需要时可以访问,其中每个阵列元素对应于特定的“速率”,因此对于相同的“速率”具有两个单独的行将使事情变得混乱。任何帮助都将非常感谢,或者如果不可能,一些其他人的确认将是很好的:)

2izufjch

2izufjch1#

使用exp1 if cond else exp2语法。

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

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

1rhkuytd

1rhkuytd2#

正确的方法很简单:

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,在Python 3.x中,exec函数和eval函数有着完全相同的签名:

exec(my_function_string, my_globals, my_locals)

在Python 2.7中,exec是一个语句,而不是函数--但是你仍然可以用Python 3.x中的语法来编写它(只要你不试图将返回值赋给任何东西),并且它可以工作。
在早期的2.x中(我想是2.6之前的版本吧?),你必须这样做:

exec my_function_string in my_globals, my_locals
lkaoscv7

lkaoscv73#

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

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

注意,在lambda中也不要使用显式的return语句。

icnyk63a

icnyk63a4#

我发现我可以在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,
}
xurqigkl

xurqigkl5#

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

lambda(T): (T>200) and (200*exp(-T)) or (400*exp(-T))
wpcxdonn

wpcxdonn6#

如果你想变得更懒:

#syntax lambda x : (false,true)[Condition]

在您的情况下:

rate = lambda(T) : (400*exp(-T),200*exp(-T))[T>200]
nzk0hqpo

nzk0hqpo7#

使用元组切片具有副作用:元组中的bothof condition将被求值为first,然后括号中的表达式被求值为任意值,其中False选择前者,True选择后者。
由于自调用函数(递归)大多需要先求尾部递归条件,这种先求后选的方法可能会导致无穷递归,从而引发RecursionError

>>> b = lambda x: (x,x*b(x-1))[x>1]
>>> print(b(3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 1, in <lambda>
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
>>> b = lambda x: x*b(x-1) if x>1 else x
>>> print(b(3))
6

对于问题本身(Y问题),请参见Python有三元条件运算符吗?

相关问题