问题描述
以下玩具函数通常采用两个输入变量:
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))