Bootstrap

【python】——Python中的*和**的作用和含义

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}
# 需要注意当打包参数的输入本身就是一个整体的tuple或者tuple时,传给形参后其实是会再将其打包一次
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'
;