Python/Python 的 uppack(解包参数)

Python/Python 的 uppack(解包参数)

基本在 Python 中,我们经常会看到 ***。这两个符号,一般在函数传参时使用。

下面来看下它们的具体作用。

函数的可变参数

*** 的第一个作用就是定义函数的可变参数,其中 * 表示的参数类似于一个 list, ** 表示的参数类似于一个 dict。

首先定义函数

1
2
3
4
5
def test(*args, **kwarg):
for item in args: # 相当于一个 list
print(item)
for k,v in kwarg.items(): # 相当于一个 dict
print(k,v)

然后调用:

1
test(1, 2, 3, a=4, b=5)

输出如下:

1
2
3
4
5
6
7
8
print args
1
2
3

print kwarg
a 4
b 5

可以看到前面的args对应的参数是 1, 2, 3,而 kwarg``a=4, b=5 对应的参数是 a=4, b=5

修改参数,再次运行:

1
test(1, 2, a=3, b=4, c=5)

输出如下:

1
2
3
4
5
6
7
8
print args
1
2

print kwarg
a 3
b 4
c 5

这次,args对应的参数是 1, 2,而 kwarg对应的参数是 a=3, b=4, c=5

unpack 参数

在传参时,也可以使用 ***,作用是 unpack (解包)参数。

还是以上面定义的函数为例。

调用如下:

1
2
3
4
x = [1, 2, 3]
y = {'a':4, 'b':5}

test(x, y)

输出如下:

1
2
3
4
5
print args
[1, 2, 3]
{'a': 4, 'b': 5}

print kwarg

可以看到,这时 args对应的参数是两个元素 x, y,不能遍历 x 或者 y 内部。而 kwarg 没有对应的参数。

首先使用*解包参数到 args 中。

1
test(*x, *y)

输出如下:

1
2
3
4
5
6
7
8
print args
1
2
3
a
b

print kwarg

可以看到,这时 args对应的参数是 x, y解包后的数据;但是 y 本来应该是一个 dict,使用一个*解包 y ,只保留了 key,丢失了 value。而 kwarg 没有对应的参数。

下面使用**把 y 解包到 kwarg 中。

1
test(*x, **y)

输出如下:

1
2
3
4
5
6
7
8
print args
1
2
3

print kwarg
a 4
b 5

评论