在python中,函数参数的工作方式其实很简单。当你编写func(a,b,c,d=some,e=value)时,位置和关键字参数其实分别是被打包成元组和字典的。函数实际接收到的是一个元组args和一个字典kwargs,并在内部完成如下转换:
a,b,c=args
d=kwargs.get('d',d_default_value)
e=kwargs.get('e',e_default_value)
这一切都是在幕后悄悄发生的。当然,它还会执行一些错误检查,还允许你将位置参数当成关键字参数那样进行指定(即使它们在函数定义中并不是关键字参数)。
def say_hello_then_call_f(f,*args,**kwargs):
print("args is: ",args)
print("kwargs is: ",kwargs)
print("Hello! Now I'm going to call %s"%f)
return f(*args,**kwargs)
def g(x,y,z=1):
return (x+y)/z
print(say_hello_then_call_f(g,1,2,z=5.))
然后,如果我们通过调用g,就会得到:
args is: (1, 2)
kwargs is: {'z': 5.0}
Hello! Now I'm going to call <function g at 0x7f4330d041e0>
0.6
*args和**kwargs不仅可以在函数定义中使用,还可以在函数调用中使用。在调用时使用就相当于pack(打包)和unpack(解包),类似于元组的打包和解包。
def demo(a,b,c,d):
print(a,b,c,d)
demo(1,*(2,3),**{'d':4})
#output
#1 2 3 4