函数参数-可变参数

可变参数,定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以)。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

def func(x,*args):

   ....

arg=(1,2,3,4,5,6)

func(arg)

我们传进的所有参数会被x和args变量收集,其中,x接收1,args接收2\3\4\5\6,它会根据传进参数的位置合并为一个元组(tuple),在函数内部args是元组类型,这就是包裹位置传递。

另一个是包裹关键字传递

def func(**kargs):

   ....

 

func(a=1)

func(a=1,b=2, c=3)

在这里,kargs是一个包含所有被传入进来的关键字参数的字典。

同样,关键字参数前面也可以有其他位置参数,包裹位置参数。下面具体介绍之。

包裹位置参数

定义包裹位置参数仅仅在形式参数前面加了一个*号。在函数内部,形式参数接收到的位置参数被组装成一个tuple。

defcalc(*numbers):

     print type(numbers)

     sum = 0

     for n in numbers:

            sum = sum + n * n

     return sum

 

>>>calc(1,2,3)                  #直接传入位置参数

14

可以看出,*号在定义函数参数时,传入函数的参数会转换成元组。

*也可以在函数调用的时候使用,在调用时则会把元组或列表解包成单个元素。这称之为解包裹(unpacking), Python允许在list或tuple前面加一个*号,这样就可以把list或tuple的元素变成可变参数传进去。

>>>nums=(1,2,3)

>>>calc(*nums)

14

>>> 

上述代码中print calc(*num) 先进行解包裹,传入calc()函数时,参数进行组装成一个元祖。再如

>>>def func(a,b):

...     print('astr=%d,bstr=%d'% (a,b))

...

>>>a=(10,20)

>>>func(*a)          #在调用函数使用`*`则会把元组解包成单个变量按顺序传入函数

astr=10,bstr=20

>>> 

可见在传递元组或列表时解包裹后,让元组或列表的每一个元素对应一个位置参数。

包裹关键字参数

关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

定义关键字参数仅仅在形式参数前面加了一个**号。

>>>def person(**dict):

     print type(dict)

     if "name" in dict:

            print dict['name']

 

>>>person(name="dhenlping",age=27)          #使用命名关键字参数 直接传入

dhenlping                                                                               

>>>

 

使用**定义参数会把传入参数包装成字典dict。这种函数在使用时必须指定参数值,使用key=value这种形式。

同*一样,**号在定义函数参数时,传入函数的参数会转换成字典,如果 **号在调用时则会把字典解包成单个元素。

>>> def func(a,b):

          print(a,b )

          

>>>d = {'a':10, 'b':20 }

>>>func(**d)        #在调用时使用**会把字典解包成变量传入函数

10 20

>>> 

可见在传递字典时解包裹后,让词典的每个键值对作为一个关键字参数传递给函数。

所以,对于任意函数,都可以通过类似func(*args,

**kw)的形式调用它,无论它的参数是如何定义的。使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。

你可能感兴趣的:(函数参数-可变参数)