Python 有没有办法更改嵌套函数的参数名?

Python 有没有办法更改嵌套函数的参数名?,python,python-3.x,function,scipy,Python,Python 3.x,Function,Scipy,因此,最简单的方法来说明我的问题是通过一个例子。假设我想写一个函数函数(a=None,b=None,c=None),这个函数一次只接受两个参数,第三个参数将留空。对于给定给函数的任何两个参数,它将返回缺少的参数,例如a+b=c。例如函数(a=5,c=15)将返回10,而函数(a=5,b=10)将返回15。现在为了论证,让我们假设a不能作为b和c的函数来编写,或者它太复杂了,无法找到封闭的解决方案(这里显然不是这样,因为要找到a,我可以简单地说a=c-b)。无论如何,如果我要写这样一个函数,我会这

因此,最简单的方法来说明我的问题是通过一个例子。假设我想写一个函数
函数(a=None,b=None,c=None)
,这个函数一次只接受两个参数,第三个参数将留空。对于给定给函数的任何两个参数,它将返回缺少的参数,例如
a+b=c
。例如
函数(a=5,c=15)
将返回10,而
函数(a=5,b=10)
将返回15。现在为了论证,让我们假设
a
不能作为
b
c
的函数来编写,或者它太复杂了,无法找到封闭的解决方案(这里显然不是这样,因为要找到
a
,我可以简单地说
a=c-b
)。无论如何,如果我要写这样一个函数,我会这样做:

#import a root finder
from scipy.optimize import newton

def function(a= None, b= None, c = None): 
    #find the missing parameter:
    vars = [a,b,c]
    comp = vars.index(None)
    
    if comp == 0: 
        def aux_fun(a): 
            return (a+b-c)
    elif comp == 1:
        def aux_fun(b):
            return (a+b-c)
    else:
        def aux_fun(c):
            return (a+b-c)
    
    return newton(aux_fun, 0)

除了编写3个不同的函数并在
newton
中调用正确的函数之外,我还没有找到解决方法。这对于这个小例子是有效的,但是如果我有一个更大的问题,比如说用100个变量编写100个函数是不漂亮的

我的问题是:是否有任何方法可以让我只需编写一次
aux_fun
,并根据
函数中缺少的参数更改其参数


非常感谢你的回答

我还没有完全理解你想做什么,但我认为你不太明白
牛顿
是如何工作的

optimize.newton
将使用

 func(x, a, b, c ...)
其中,
x
是初始值大小的标量或数组,
x0
。其他参数通过
args
元组传递。这种向函数传递迭代变量和
args
的模式在这些
scipy.optimize
函数中广泛使用。我已经回答了一些关于这些论点的问题

 newton(func, x0, args=(a,b,c))
这些不是关键字参数

 newton(func, x0, args=(a,b,c))
阅读并实验文档中的示例。人们经常弄乱
args
元组。然后,在认真尝试进行这种“重命名”之前,先研究一下自己的一些小例子

编辑 这可能行得通-我还没有测试过:

def function(a= None, b= None, c = None): 
    #find the missing parameter:
    vars = [a,b,c]
    comp = vars.index(None)

    def aux_fun(x):
        vars[comp] = x
        a,b,c = vars
        return (a+b-c)
    
    return newton(aux_fun, 0)

我还没有完全理解你想做什么,但我认为你不太明白牛顿是如何工作的

optimize.newton
将使用

 func(x, a, b, c ...)
其中,
x
是初始值大小的标量或数组,
x0
。其他参数通过
args
元组传递。这种向函数传递迭代变量和
args
的模式在这些
scipy.optimize
函数中广泛使用。我已经回答了一些关于这些论点的问题

 newton(func, x0, args=(a,b,c))
这些不是关键字参数

 newton(func, x0, args=(a,b,c))
阅读并实验文档中的示例。人们经常弄乱
args
元组。然后,在认真尝试进行这种“重命名”之前,先研究一下自己的一些小例子

编辑 这可能行得通-我还没有测试过:

def function(a= None, b= None, c = None): 
    #find the missing parameter:
    vars = [a,b,c]
    comp = vars.index(None)

    def aux_fun(x):
        vars[comp] = x
        a,b,c = vars
        return (a+b-c)
    
    return newton(aux_fun, 0)

你想要的是不可能的。给定一个通用函数f(a,b,c,d)=0,没有办法将其转换为一组函数a=f1(b,c,d),b=f2(a,c,d),等等。您正在进入符号计算领域。你需要你的代码来理解三角、代数、微积分、指数和对数


根据下面的评论进行更新

所以你想要的是:

def aux_func(x):
    vars[comp] = x
    return f(*vars)

你想要的是不可能的。给定一个通用函数f(a,b,c,d)=0,没有办法将其转换为一组函数a=f1(b,c,d),b=f2(a,c,d),等等。您正在进入符号计算领域。你需要你的代码来理解三角、代数、微积分、指数和对数


根据下面的评论进行更新

所以你想要的是:

def aux_func(x):
    vars[comp] = x
    return f(*vars)

现在还不清楚你到底想用什么样的论点来取笑aux_。但是
vars.index(None)
将告诉您缺少的参数的索引。从这个索引中,你可以推断出你需要的任何信息。我很难理解你的例子,因为看起来你心里有一个具体的例子,但是你给了我们一个例子,这个例子不是太简单,而是过于简单,以至于不能解决你需要做的事情。您是否考虑过让在第一个函数中调用命名参数的顺序与在第二个函数中调用位置参数的顺序不同。@FrankYellin,是的,这是找到缺少的参数的更好方法,我将更改它。@hrokr,很抱歉,这似乎过于简化了,但我的问题可以总结为:如何创建一个为缺少的参数返回值的函数,而不必为每个可能缺少的参数创建嵌套函数。我们需要一份工作。文字问题,即使用粗体字来表达,也是一种痛苦。不清楚你到底想用什么论点来表达它。但是
vars.index(None)
将告诉您缺少的参数的索引。从这个索引中,你可以推断出你需要的任何信息。我很难理解你的例子,因为看起来你心里有一个具体的例子,但是你给了我们一个例子,这个例子不是太简单,而是过于简单,以至于不能解决你需要做的事情。您是否考虑过让在第一个函数中调用命名参数的顺序与在第二个函数中调用位置参数的顺序不同。@FrankYellin,是的,这是找到缺少的参数的更好方法,我将更改它。@hrokr,很抱歉,这看起来过于简化了,但我的问题可以总结为:如何创建一个函数,为缺少的参数返回一个值,而不必