Python中多参数的乘法函数
很明显,h(x,y,z)=f(x,y)*g(y,z)是什么意思。我想要一个Python设备来做类似的事情,比如:Python中多参数的乘法函数,python,function,Python,Function,很明显,h(x,y,z)=f(x,y)*g(y,z)是什么意思。我想要一个Python设备来做类似的事情,比如: fmul(f1(x,y),f2(y,z)) -> lambda x,y,z: f1(x,y)*f2(y,z) fmul(f1(x,y),f2(z,y)) -> lambda x,y,z: f1(x,y)*f2(z,y) 依此类推,这取决于参数名。当然,它不会像上面的伪代码那样工作,因为Python将首先尝试对f1和f2调用求值,并且由于这些调用将使用一些变量名而不是值来
fmul(f1(x,y),f2(y,z)) -> lambda x,y,z: f1(x,y)*f2(y,z)
fmul(f1(x,y),f2(z,y)) -> lambda x,y,z: f1(x,y)*f2(z,y)
依此类推,这取决于参数名。当然,它不会像上面的伪代码那样工作,因为Python将首先尝试对f1和f2调用求值,并且由于这些调用将使用一些变量名而不是值来进行,因此将引发NameError。有没有一种方法可以将这些变量名不变地传递给lambda的定义,以便获得一个具有定义良好的参数顺序的适当函数对象?我想,用Lisp这样的语言,用宏和符号,做起来会相对容易,但用Python怎么做呢?我找到的最接近解决方案是使用inspect模块来检索函数参数,但这些参数是字符串,因此我必须通过连接字符串来组合lambda表达式,然后对其求值。难道没有更直接的方法吗?将函数作为参数传递:
def fmul(f1, f2):
return (lambda x,y,z: f1(x,y)*f2(y,z))
如果您事先知道参数名称(并且可以重新定义
f1
和f2
),则可以使用关键字参数,而不必使用inspect
:
def f1(x, y, **kwargs):
return x + y
def f2(z, y, **kwargs):
return z - y
def fmul(f1, f2):
return lambda x, y, z: f1(x=x, y=y, z=z) * f2(x=x, y=y, z=z)
执行
f1
和f2
时,值来自哪里?@ColinBasnettlambda@ColinBasnett它们来自返回的函数的调用方newfun=fmul(somefun,someotherfun)
然后newfun(x,y,z)
。回答得好。除了lambda
,也许可以使用def
来显示备用版本,以使其更清晰?这不是问题的重点。关键是如何告诉fmul在传递给它的两个函数中哪些参数是相同的。参数名是固定的(即总是x
、y
、和z
)还是可以是任意的?您是否总是使用x
和y
调用f1
,只是使用未知的参数顺序?理想情况下,我不想依赖参数的名称,而是通过某种方式告诉fmul“使f1的第二个参数等于f2的第一个参数”等等。当然,这将取消我提到的检查方法的资格。此外,参数的数量可以是任意数量,在两个函数中不一定都是2。Python语言没有这种级别的符号操作。你可能想看看[SymPy](www.SymPy.org),这可能是个好建议。事实上,我认为SymPy在内部执行了我上面建议的操作,操作字符串,然后可能使用eval()将其转换为可执行函数。至少我不用自己写整件事了。