Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中多参数的乘法函数_Python_Function - Fatal编程技术网

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调用求值,并且由于这些调用将使用一些变量名而不是值来

很明显,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调用求值,并且由于这些调用将使用一些变量名而不是值来进行,因此将引发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()将其转换为可执行函数。至少我不用自己写整件事了。