单星号*,用于展开可迭代的数据,
双星号 **,用于展开字典。
单个的星号*操作,表示展开一个可迭代的数据。哪些数据是可迭代的呢?常见的如列表,元组, 字符串等。
a, b, c = '123'
print(a, b, c)
d, e, f = ['Ann', 30,'Monky']
print(d, e, f)
1 2 3
Ann 30 Monky
上面的例子中,可迭代数据中的元素可以是字符串‘123’或者列表,其中元素都只有三个。左边用来展开可迭代数据的变量个数也有三个。一个匹配一个即可。但是左边用来匹配的只有两个,可以怎么做呢?
a, *b = '123'
print(a, b)
d, *rest = ['Ann', 30,'Monky']
print(d,rest)
1 ['2', '3']
Ann [30, 'Monky']
通过借助*星号,可以成功的将后续匹配出来,形成列表。
a, *b, c = '12345'
print(a, b,c)
1 ['2', '3', '4'] 5
从这些例子可以看出来,利用星号表达式,可以匹配任意长度的可迭代数据。
调用函数时候,作为函数的参数来输入,可以将所有输入参数组合在一起,再一起放到函数中。比如下面的add函数有两个输入参数,可以通过用inputs=[1,2]将两个值放在一起,并且*展开inputs作为输入,来调用add,实现函数调用。
def add(x, y):
print("add output:",x+y)
input = [4, 5]
add(*input)
add output: 9
注意,上面的input前需要加*,如果不加则报错:
错误提示是输入的参数个数不对,只有一个用来匹配了x,缺少一个用来匹配y的。但是利用*来将[1,2]列表展开后,就有了两个元素,可以作为add函数的两个输入参数,符合函数的参数个数要求,就不会有错误了。
在函数定义时候使用*args(args也可以是别的名字)作为输入参数,表示可以用来匹配任意个数(或者可变长度参数)的输入输入参数。
def func1(*args):
print(*args)
def func2(*args):
print(args) # 以元组形式输出
func1(1,2,3,'abc')
func2(1, 2, 'abc')
1 2 3 abc
(1, 2, 'abc')
可以看到,args匹配到了所有的输入参数值,按输入值的顺序,组成了一个列表。因此*args,可以完成函数的位置参数(positional argument)的匹配。
**用来展开字典。可以用来合并字典,比如dic1和dic2想要合并为一个大字典dic3,可以用dic3 = {**dic1, **dic2}来完成;如果用dic3 = {dic1, dic2}则会报错。
同样在函数调用时,使用**来实现关键字参数的输入例子。
def func1(x, y):
print("func1--output:",x, y)
func1(2,3)
kwargs={'x':1, 'y':2}
func1(**kwargs)
# 在func1函数调用时候,使用**将kwargs展开,变成了需要的关键字参数,func1(**kwarg)相当于调用func1(x=1,y=2)。
# 注意,这里的kwargs的key要和func1接收的参数名称要一致!!!
func1--output: 2 3
func1--output: 1 2
如果在函数定义时,做为输入,可以用来匹配关键字参数,并且在调用时候,将关键字参数的关键字和输入值,组成字典。
def func(**kwargs):
print(kwargs)
func(x=1, y=2)
可以看到,kwargs将输入的关键字参数均组成了到了一个字典里面。
{'x': 1, 'y': 2}
def func(*args, **kwargs):
print(args, kwargs)
func(1, 2, 3, x=1, y=2)
# (1, 2, 3) {'x': 1, 'y': 2}
func(1, 2, 3, x=1, y=2, 4) # SyntaxError: positional argument follows keyword argument
参考博客