星号在python的函数中经常会使用到,分别在函数定义和函数调用中起到收集或者分配参数,单星号*只对单个参数对象作用,**只对键值对类型的关键字参数作用。
例如:
def foo(*a):
print(a[0])
foo(1, 2, 3)
>>> 1
def foo(a, b, c):
print(c)
a = [1, 2, 3]
foo(*a)
>>> 3
def foo(a, b, c):
print(c)
m = {'a':1, 'b':2, 'c':3}
foo(**m)
>>> 3
def foo(**m):
print(m)
foo(a=1, b=2, c=3)
>>> {'a': 1, 'b': 2, 'c': 3}
有时候函数参数列表中会出现单独一个*,这是因为python3中**表示以关键字形式来指定参数,从而实现在位置顺序不对应的情况下,也可以明确参数对应关系。在此类函数的形参列表中会出现*,这是星号表示位置参数结束,之后的参数以关键字形式表示,该星号不会被赋予任何值。
def www(to_float32: bool = False,
color_type: str = 'color',
imdecode_backend: str = 'cv2',
ignore_empty: bool = False,
*,
backend_args: dict = None) -> None:
print(backend_args)
pipeline=dict(imdecode_backend='cv', backend_args=dict(backend='disk'))
www(**pipeline)
此时,利用**来强制以关键字形式解开pipeline中的键值,并按照对应关系进行赋值
def www(to_float32: bool = False,
color_type: str = 'color',
imdecode_backend: str = 'cv2',
ignore_empty: bool = False,
*,
backend_args: dict = None) -> None:
print(backend_args)
backend=dict(backend_args='disk')
www(True, 'binary', **backend)
www(True, 'binary', 'matplot', True, backend)
www(True, 'binary', 'matplot', True, **backend)
此时,www(True, 'binary', **backend)
前两个参数按照位置复制,backend需找对应得键值对;www(True, 'binary', 'matplot', True, backend)
则会报错,因为*表示之后的参数必须用**来赋值,即第三行www(True, 'binary', 'matplot', True, **backend)