赞
踩
在python的函数中经常能看到输入的参数前面有一个或者两个星号,例如:
- def fun1(param1, *param2):
- def fun2(param1, **param2):
- def fun3(param1, *param2, **param3)
*args, **kwargs 其实都是用来将任意个数的参数导入到python函数中。
具体而言:
- def fun(param1, *param2):
- print(param1)
- print(param2)
- if __name__ == '__main__':
- fun(1,2,3,4,5)
- ---------------
- out:
- 1
- (2, 3, 4, 5)
分析:
(1) 由于形参param1只能接收一个实参,所以param=1被导入函数fun中
(2) 剩下的输入2,3,4,5被打包成元组赋给param2,所以*param2前面的*号表示这是一个元组,可以理解为是一个标志,便于编译器理解。如果没有这个*号,编译器会默认将数值2赋给param2,而不是(2,3,4,5)
注意:
(1) 在子函数中,param2就变成了独立的变量了,不需要*号作为标志。可以作为元组正常索引。
(2) 由上例知道*args是可变长度的,这也是其优点之一
- def fun2(param1, **param2):
- print(param1)
- print(param2)
- if __name__ == '__main__':
- fun2(1,a=2,b=3)
- ------------------------------
- out:
- 1
- {'a': 2, 'b': 3}
分析:
(1) 由于形参param1只能接收一个实参,所以param=1被导入函数fun中
(2) 剩下的输入a=2,b=3 被打包成字典赋给param2,所以**param2前面的*号表示这是一个字典,可以理解为是一个标志,便于编译器理解。
注意:
(1) 在子函数中,param2就变成了独立的变量了,不需要**号作为标志。可以作为字典正常索引。
(2) 由于**kwargs是字典类型,所以实参在输入的时候,要有字典所需要的key-value即键值对,不能单单输入数值
(3) 由上例知道**kwargs是可变长度的,这也是其优点之一
注意点:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。
- def fun3(a, b=9, *args, **kwargs):
- print(a)
- print(b)
- print(args)
- print(kwargs)
- if __name__ == '__main__':
- fun3(1, 2, 3, 4, c=5, d=6, e=7)
- --------------------------------
- out:
- 1
- 2
- (3, 4)
- {'c': 5, 'd': 6, 'e': 7}
上述的单星号用于子函数的输入,这里用于主函数中输入实参的操作中,作用是解压参数列表:
- def fun4(a, b):
- print(a)
- print(b)
-
- if __name__ == '__main__':
- input = [1, 2]
- fun4(*input)
- -----------------------
- out:
- 1
- 2
注意:子函数的形参个数要与解压之后数据的长度保持一致
同理,**kwargs也有类似用法,但是由于字典有key-value对,所以用法稍微有些不同。不同点在于:主函数中**用来解压,子函数中**用来做字典的标志。不同位置含义不同
- def fun4(**kwargs):
- print(kwargs['a'])
- print(kwargs['b'])
- for key, value in kwargs.items():
- print(key)
- print(value)
-
- if __name__ == '__main__':
- input = {'a':1,'b':2}
- fun4(**input)
- -------------------
- 1
- 2
- a
- 1
- b
- 2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。