在前面的文章中我们已经说过函数定义时带星号参数的使用,也就是将实参收集成元组(一个星号)和字典(两个星号)。但在事实上也可以执行相反的操作,比如一个做加法的函数,def add(x, y),函数定义的时候是很常见的形参定义,但是我们要相加的两个数在一个元组中param = (1, 2),调用的时候这样调用即可add(*param),表明我们传递的是一个元组对象,需要将元组中的数据传递给形参。写个简单的代码测试下:
#! encoding=utf-8
def test_add(x, y):
return x + y
if __name__ == "__main__":
param = (1, 2)
print test_add(*param)
控制台:
3
当然函数调用时也可以使用带两个星号的实参,和一个星号的原理相同,只是传递的是一个字典对象给形参,需要注意的是在定义的形参变量名要和传递的字典对象中的key值是一样的,否则无法解析传递的字典。
#! encoding=utf-8
def test_add(x, y):
return x + y
if __name__ == "__main__":
param = {'x' : 1, 'y' : 2}
print test_add(**param)
控制台打印:
3
其实调用的时候实参前面带星号和定义的时候形参前面带星号是一个互逆的过程,形参带星号,是需要将传递的数据打包成元组或者字典,调用时实参带星号,是要将传递的元组或者字典解析到形参中去。
最后写一个两者结合的形式,加深下理解。代码如下:
#! encoding=utf-8
def test_all(tuple_str1, tuple_str2, dict_str1, dict_str2, dict_str3):
return tuple_str1 + tuple_str2 + dict_str1 + dict_str2 + dict_str3
if __name__ == "__main__":
param_tuple = ('hello ', 'everyone ')
param_dict = {'dict_str1' : 'this ', 'dict_str2' : 'is ', 'dict_str3' : 'test'}
print test_all(*param_tuple, **param_dict)
控制台信息:
hello everyone this is test