可以省略可选参数并在Python函数中使用* args吗?

时间:2013-11-24 23:03:28

标签: python function arguments keyword-argument

我想知道在Python中使用* args时是否可以保留一个可选参数(使用它的默认值)。以下代码通过“print(a)”工作,因此在deri函数调用中明确包含可选参数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)

2 个答案:

答案 0 :(得分:2)

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

相反,使用**kwargs参数捕获任意关键字参数,并在其中查看h

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

现在,您必须在致电h时明确命名deriv

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

答案 1 :(得分: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