在python中的*和**除了分别表示乘法运算和幂运算外还有其它作用。在python中可能会经常看到类似于def function1(*args, **kwargs)
的函数定义形式,或者看到function1(*v1, **v2)
的函数调用形式,很多没看到过的人可能会不知所以。下面分别说明:
符号*
在函数定义中
在函数定义时,*
表示可变位置参数, *
修饰的参数表示可以传递任意个数的参数,传递的参数在函数内部表现为一个元组(tuple
)。例如:
>>> def test_args(*args):
... print(type(args))
... print(args)
... for arg in args:
... print(arg)
...
>>> test_args(1, 2, 'hello')
<type 'tuple'>
(1, 2, 'hello')
1
2
hello
示例中传递了三个参数,可以看到args的类型为tuple,可以采取任意的适用与tuple的方法处理args。
在函数调用中
在函数调用中,*
会将使用它修饰传递的参数进行迭代展开,例如:
>>> def func(a, b, c):
... return a+b+c
...
>>> func(*[1, 2, 3])
6
>>> func(*(i*i for i in range(3)))
5
>>> def func(*args):
... print(args)
...
>>> func(*range(10))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
符号**
在函数定义中
在函数定义时,**
表示可变关键字参数,表示可以传递任意个数的关键字参数(形如a = 1, b = 2
),在函数内部表现为一个字典(dict
),例如:
>>> def test_kwargs(**kwargs):
... print(type(kwargs))
... print(kwargs)
... for k,v in kwargs.items():
... print('%s:%s'%(k, v))
...
>>> test_kwargs(a = 1, b = 2)
<type 'dict'>
{'a': 1, 'b': 2}
a:1
b:2
在函数调用中
在函数调用中,**
修饰的传递的参数会被当作字典以key=value
的形式展开,例如:
>>> def func(a, b, c):
... print("a:%s; b:%s; c:%s"%(a, b, c))
>>> func(**{'c':1, 'b':2, 'a': 3})
a:3; b:2; c:1
...
>>> def func(**kwargs):
... print(kwargs)
>>> func(**{'c':1, 'b':2, 'a': 3})
{'a': 3, 'c': 1, 'b': 2}