python中函数参数的打包和解包

最近学习scipy中的optimize模块的几个函数,包括fsolve,leastsq。注意到里面有几处函数调用,其参数调用不是很了解。于是百度/Google了一下。看了看觉得收益匪浅。

以fsolve为例,其定义如下:

def fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-8, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)

Parameters

func : callable “f(x, *args)“
A function that takes at least one (possibly vector) argument.

x0 : ndarray
The starting estimate for the roots of “func(x) = 0“.

args : tuple, optional
Any extra arguments to `func`.

fprime : callable(x), optional
A function to compute the Jacobian of `func` with derivatives across the rows. By default, the Jacobian will be estimated.

其中args参数的传递,一直不太明白,是怎么传的,如何赋值。调用的时候是怎么判断函数需要几个参数的(这个应该是自己定义的,自己清楚)。今天查了一下函数参数的打包与解包才算弄清楚。

摘录关键部分如下:

python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的。

一、打包参数

* 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args。

** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs。

二、解包参数

* 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数。

** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数。

打包和解包并不能脱离函数而存在!!