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

Can omit optional arguments and use *args in a Python function?

本问题已经有最佳答案,请猛点这里访问。

我试图弄清楚在python中使用*args时是否可以去掉一个可选参数(使用它的默认值)。以下代码通过"print(a)"工作,因此在派生函数调用中显式包含可选参数h。我能把它放在外面吗?我的尝试("B=…","C=…","D=…")失败。还有别的办法吗?

1
2
3
4
5
6
7
8
9
10
11
12
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首先将位置参数应用于所有已命名的参数;h是函数签名中的第三个位置参数,因此只有参数位置4及以上由*params捕获。

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

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

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

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

看起来您使用的是python 3,所以您可以只使用关键字参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> 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