Python 中的多元 lambda 函数,随接收到的输入变量的数量而缩放

问题描述

以下玩具函数通常采用两个输入变量:

f = lambda u1,u2 : (u1*u2)*(u1**2+u2**2)

但可以超出二元情况扩展到更高维度:

if dim == 2:
    f = lambda u1,u2 : (u1*u2)*(u1**2+u2**2)
if dim == 3:
    f = lambda u1,u2,u3 : (u1*u2*u3)*(u1**2+u2**2+u3**2)
if dim == 4:
    f = lambda u1,u3,u4 : (u1*u2*u3*u4)*(u1**2+u2**2+u3**2+u4**2)

如何编写 lambda 函数以便它可以在调用 lambda u1,u4,... 中扩展自身以及函数体本身,基于发送给它的输入数量,类似于如何声明定义的函数作为 def f(*args) 其中 *args 是任意数量的输入参数?

解决方法

lambda syntax 支持与 def syntax 相同的参数列表语法,包括可变位置参数和关键字参数。

f = lambda *us: math.prod(us) * sum(u**2 for u in us)

如果 *us 在乘以 1 或添加到 0 时不是不变的,则可以通过 *+ 操作跨元素应用{3}}:

from functools import reduce
import operator

f = lambda *us: reduce(operator.mul,us) * reduce(operator.add,(u**2 for u in us))