您可以在lambda中分配变量吗?

Pro*_*ill 5 python variables lambda

我当时使用一条lambda语句执行数学运算,并且碰巧反复使用一个特定值。因此,我想知道是否可以在lambda语句中分配和使用变量。

我已经尝试过类似的事情:

a = lambda n:(b=3+2*n) #[my math here]
Run Code Online (Sandbox Code Playgroud)

但是,这只会引发错误,我想知道是否有一种方法可以做到这一点。

tob*_*s_k 7

不,你不能。仅允许使用表达式lambda

lambda_expr        ::=  "lambda" [parameter_list]: expression
lambda_expr_nocond ::=  "lambda" [parameter_list]: expression_nocond
Run Code Online (Sandbox Code Playgroud)

但是,您可以定义第二个 lambda 内部lambda,并立即与你想要的参数调用它。(这是否真的更好,可能是另一个问题。)

>>> a = lambda n: ((3+2*n), n*(3+2*n))  # for reference, with repetition
>>> a(42)
(87, 3654)
>>> a2 = lambda n: (lambda b: (b, n*b))(3+2*n)  # lambda inside lambda
>>> a2(42)
(87, 3654)
>>> a3 = lambda n: (lambda b=3+2*n: (b, n*b))()  # using default parameter
>>> a3(42)
(87, 3654)
Run Code Online (Sandbox Code Playgroud)

当然,外部和内部lambda都可以具有多个参数,即,您可以一次定义多个“变量”。这种方法相对于例如在第一个Lambda 之外定义第二个Lambda的好处是,您仍然可以使用原始参数(如果a使用b预先计算的),并且b只需要进行一次计算(除了重复调用b内的计算功能外a)。


另外,受到 链接问题最高答案的,您还可以在lambda中将一个或多个变量定义为列表推导或生成器的一部分,然后next从该生成器或列表中获取(第一个也是唯一的)结果:

>>> a4 = lambda n: next((b, n*b) for b in [3+2*n])
>>> a4(42)
(87, 3654)
Run Code Online (Sandbox Code Playgroud)

但是,我认为lambda-in-a-lambda背后的意图更加明确。最后,请记住,除了单行代码lambda,您还可以使用更清晰的三行def语句...


同样,从Python 3.8开始,将有赋值表达式,这应该使编写这样的事情成为可能。(请注意,由于我还没有Python 3.8,因此无法尝试/验证。)

>>> a5 = lambda n: ((b := 3+2*n), n*b))
Run Code Online (Sandbox Code Playgroud)

  • 对于新访问者:请注意,最后一个命题不适用于 Python 3.8,因为 lambda 函数中不允许使用赋值表达式。 (3认同)