【问题标题】:Can omit optional arguments and use *args in a Python function? [duplicate]可以省略可选参数并在 Python 函数中使用 *args 吗? [复制]
【发布时间】:2013-12-09 12:59:35
【问题描述】:

我想弄清楚在 Python 中使用 *args 时是否可以保留可选参数(使用它的默认值)。以下代码通过“print(a)”工作,因此在派生函数调用中显式包含可选参数 h 有效。我可以以某种方式将它(h)留在外面吗?我的尝试(“b = ...”、“c = ...”、“d = ...”)失败了。还有其他方法吗?

def deriv(f, x, h=1.e-9, *params):
    return (f(x+h, *params)-f(x-h, *params))/(2.*h)

def f1(x, a, p):
    return a*x**p

a = deriv(f1, 3, 1.e-9, 4, 5)
print(a)

b = deriv(f1, 3, , 4, 5)
c = deriv(f1, 3, 4, 5)
d = deriv(f1, 3, h, 4, 5)

【问题讨论】:

    标签: python function arguments keyword-argument


    【解决方案1】:

    看起来你使用的是 Python 3,所以你可以使用keyword-only arguments

    >>> def deriv(f, x, *params, h=1.0E-9):
        print(f)
        print(x)
        print(params)
        print(h)
    
    >>> deriv(pow, 'x', 10, 20, 30)
    <built-in function pow>
    x
    (10, 20, 30)
    1e-09
    
    >>> deriv(pow, 'x', 10, 20, 30, h=.2)
    <built-in function pow>
    x
    (10, 20, 30)
    0.2
    

    【讨论】:

      【解决方案2】:

      不,python 将位置参数应用于所有命名参数first; h 是函数签名中的第三个位置参数,因此*params 仅捕获参数位置 4 及以上。

      相反,使用**kwargs 参数捕获任意关键字参数,然后查看h

      def deriv(f, x, *params, **kwargs):
          h = kwargs.pop('h', 1.e-9)
      

      您现在必须在调用 deriv 时明确命名 h

      b = deriv(f1, 3, 4, 5, h=2.0)
      

      【讨论】:

        猜你喜欢
        • 2015-12-05
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 2014-06-19
        • 2014-06-03
        • 2020-10-30
        • 2022-01-02
        • 1970-01-01
        相关资源
        最近更新 更多