【问题标题】:Argument Unpacking while Defining Function in Python在 Python 中定义函数时的参数解包
【发布时间】:2021-09-22 15:56:44
【问题描述】:

我正在尝试将列表传递到函数的定义中以创建新变量。这里的用例是运行scipy的curve fit来找到函数的最优参数。我希望这个函数能够动态地获取任意数量的变量,而无需专门输入我希望它优化/解决的所有变量(b1、rate_1 等)。现在我有一个要包含的变量列表,但似乎无法让函数将它们创建为函数定义中的新参数,看起来我需要这样做。

如下所示,我熟悉在函数中使用 *,但它似乎是在函数已经定义并且您正在调用它的情况下使用的。我想做一些类似的事情,但在函数的定义中,所以函数本身将 b1、rate_1 等识别为可以使用 curve_fit 求解的参数。

我的入门代码:

def get_optimal_adstock_multivariate(x_var_names):
   y = np.array(final_df['Count Of Solutions'])
   # make list of coefficient variables (b1, b2, etc.) and make new variables for each rate (rate_1, rate_2, etc.)
   coef_vars = []
   rates = []
   for i in range(0, len(x_var_names)):
      coef_vars.append("b" + str(i+1))
      rates.append("rate_" + str(i+1))
   coef_vars_rates = coef_vars + rates

   def f(final_df, b0, *coef_vars_rates): # using * to pass b1, rate_1, b2, rate_2, etc. as parameters (unpacking the list)
      # need this function to recognize final_df, b0, b1, rate_1, etc. as variables

【问题讨论】:

标签: python function optimization scipy scipy-optimize


【解决方案1】:

很遗憾,您不能直接让函数识别这些变量。 您可以使用带有双 * 的关键字参数并从结果字典对象中对其进行寻址:

def f(a, b, **kwargs):
    ... kwargs["b0"] ...

发布此内容希望对您有所帮助,但我知道这不是您问题的完整解决方案。

【讨论】:

    【解决方案2】:

    我不明白你想用 x_var_names 做什么。

    我们可以定义等价函数:

    In [260]: a, b, c = 1,2,3
    In [261]: def foo0(x, *args):
         ...:     print(x, args)
         ...: 
    In [262]: def foo1(x, a,b,c):
         ...:     print(x, a,b,c)
         ...: 
    

    并将它们称为变量列表或实际变量:

    In [263]: alist=[a,b,c]
    In [264]: foo0(100,*alist)
    100 (1, 2, 3)
    In [265]: foo1(100,*alist)
    100 1 2 3
    In [266]: foo0(100,a,b,c)
    100 (1, 2, 3)
    In [267]: foo1(100,a,b,c)
    100 1 2 3
    

    或者,如果我在 foo0 中优化 print,我会在两者中得到相同的显示:

    In [268]: def foo2(x, *args):
         ...:     print(x, *args)
         ...: 
    In [269]: foo2(100,a,b,c)
    100 1 2 3
    

    看看curve_fit。它适用于foo1foo2 签名。

    f(xdata, *params)
    

    params 的数量由p0 确定,尽管它也谈到了通过自省来确定它们。由此我认为它可以推断出foo1 期望 3 个值。

    不要将全局环境中的变量名与变量或通过curve_fit 传递给函数的值元组混淆。本地名称也可以不同。例如

    def foo3(x, *args):
        a,b,c = args
        print(x, a,b,c)
    

    使用本地解包,其中a,b,c 只是在函数中引用值的便捷方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-14
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2015-11-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多