Python中的 * 和 ** 的作用和含义
python中的*和**被称为打包和解包参数,主要作用是能够让函数支持任意数量的参数,但是在函数定义和调用中,有着不同的使用场景,具体看下面的例子
打包参数
作为打包参数时,一般在函数形参定义时使用
- 的作用:在调用函数时,将传给函数的所有位置的实参收集到一个元组中,并将该元组作为一个整体赋值给函数形参
def func(*args):
print(args)
>>>func(1,2,3,4)
(1,2,3,4)
**的作用:在调用函数时,将传给函数的所有位置的实参收集到一个字典中,并将该字典赋值给形参
def func(**kwargs):
print(kwargs)
>>>func(a=1,b=2)
{'a':1,'b':2}
解包参数
作为解包参数时,一般在函数实参传入时使用 *的作用:在函数调用时,*能够将list或元组解包成不同的参数
def func(a,b,c,d):
print(a,b,c,d)
>>> args = (1,2,3,4)
>>> func(*args)
1 2 3 4
>>> args = [1,2,3,4]
>>> func(*args)
1 2 3 4
**的作用:在函数调用中,**会将已经打包好的字典,解包成独立的key-value对,并将解包后的参数传给函数形参
def func(a,b,c,d):
print(a,b,c,d)
>>> kwargs = {"a":1,"b":2,"c":3,"d":4}
>>>func(**kwargs)
1 2 3 4
经典问题:func(*argc,**kwargc)中 *argc与 **kwargc的作用是什么?
有个上面的铺垫,显然这里*argc是tuple的打包参数,**kwargc是dict的打包参数 举个例子
def foo(*args,**kwargs):
print ('args=',args)
print ('kwargs=',kwargs)
print ('**********************')
if __name__=='__main__':
foo(1,2,3)
foo(a=1,b=2,c=3)
foo(1,2,3,a=1,b=2,c=3)
foo(1,'b','c',a=1,b='b',c='c')
args= (1, 2, 3)
kwargs= {}
**********************
args= ()
kwargs= {'a': 1, 'b': 2, 'c': 3}
**********************
args= (1, 2, 3)
kwargs= {'a': 1, 'b': 2, 'c': 3}
**********************
args= (1, 'b', 'c')
kwargs= {'a': 1, 'b': 'b', 'c': 'c'}
**********************
增加难度的例子
def foo(*args,**kwargs):
print ('args=',args)
print ('kwargs=',kwargs)
print ('**********************')
v = (1,2,4)
d = {'a':1, 'b':12}
foo(v)
foo(d)
foo(v,d)
输出
args= ((1, 2, 4),)
kwargs= {}
**********************
args= ({'a': 1, 'b': 12},)
kwargs= {}
**********************
args= ((1, 2, 4), {'a': 1, 'b': 12})
kwargs= {}
**********************
再增加难度的例子 在函数定义时:*表示打包,在函数体内部时,*表示的其实是解包
def foo(*argc,**kwargc):
print(argc)
print(*argc)
v = (1,2,4)
d = {'a':1,'b':2}
foo(v,d)
输出
((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}
再再再增加难度的例子 打包和解包参数并不能脱离函数而存在
c = {"name":'zhang',"age":2}
>>> **c
>>> "Name:{name},Age:{age}".format(**c)
'Name:zhang, Age:2'
|