python中*args和**kwargs的区别
*args --表示所有参数的元组(tuple)
如:(1, 2, 3, 4)
**kwargs --表示传入的键值对(key = value),返回数据结果为字典(dict)
如;{‘a’: 1, ‘b’: 2, ‘c’: ‘e’, ‘d’: 5}
例一:
def func(test, *args, **kwargs):
print("test = ", test)
print("args = ", args)
print("kwargs = ", kwargs)
func("testData")
print('-----------------------------------')
func( 1, 2, '3')
print('------------------------------------')
func("testData", 1, 2, '3', a=4, b="foo")
运行结果:
test = testData
args = ()
kwargs = {}
-----------------------------------
test = 1
args = (2, '3')
kwargs = {}
------------------------------------
test = testData
args = (1, 2, '3')
kwargs = {'a': 4, 'b': 'foo'}
例二:
def func(*args):
print(args)
func()
func(12,'a','c',3)
func(12,'a','c',3,a=2,c=5,d='f') #这种情况会报错,没有定义关键字参数**kwargs,报错信息见运行结果
运行结果:
()
(12, 'a', 'c', 3)
Traceback (most recent call last):
File "E:/test/pylearning/argKwarg.py", line 34, in <module>
func(12,'a','c',3,a=2,c=5,d='f')
TypeError: func() got an unexpected keyword argument 'a'
例三:
def func(**kwargs):
print(kwargs)
func()
func(a=2,c=5,d='f')
func(12,'a','c',3,a=2,c=5,d='f') #这种情况会报错,没有定义无名参数*args,报错信息见运行结果
运行结果:
{}
{'a': 2, 'c': 5, 'd': 'f'}
Traceback (most recent call last):
File "E:/test/pylearning/argKwarg.py", line 33, in <module>
func(12,'a','c',3,a=2,c=5,d='f')
TypeError: func() takes 0 positional arguments but 4 were given
说明:
- *args和**kwargs是python中的可变参数;
- *args表示的是无名参数,可任意数量,其结果组成是一个元组;
- **kwargs表示的是关键字参数,即每一个参数都是以键值对(key = value)的形式出现的,其结果组成是一个字典;
- 在定义参数时,*args和**kwargs可以不传参;
- args和**kwargs可以单独出现也可以一起出现,但一起出现的时候必须args在**kwargs之前。