Python从入门到实践:打包和解包(*和**)的使用

  • Post author:
  • Post category:python



目录


一、打包参数


二、解包参数


三、几点注意




*和**在函数的定义和调用阶段,有着不同的功能,并且,*和**不能离开函数使用!

一、打包参数



* 的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args

>>> def f(*args):      # * 在函数定义中使用
        print(args)


>>> f()
()
>>> f(1)
(1,)
>>> f(1, 2, 3, 4)
(1, 2, 3, 4)

我们可以看到,1,2,3,4传入的时候,*args可以把它们打包起来(这时,1,2,3,4可以看成是一个整体,相当于由四个参数变成了一个)



** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwarg

>>> def f(**kwargs):        # ** 在函数定义中使用
    print(kwargs)


>>> f()
{}
>>> f(a=1, b=2)
{'a': 1, 'b': 2}

二、解包参数



* 的作用:在函数调用中,* 能够将元组或列表解包成不同的参数(打包的时候是打包成元祖,解包可以解包元祖和列表)

>>> def func(a, b, c, d):
    print(a, b, c, d)


>>> args = (1, 2, 3, 4)
>>> func(*args)     # * 在函数调用中使用
1 2 3 4

>>> args = [1, 2, 3, 4]
>>> func(*args)
1 2 3 4


注意:原本args是一个整体,也就是一个参数,通过*解包之后,变成了四个参数,所以函数要有4个变量来接收



** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数

>>> def func(a, b, c, d):
    print(a, b, c, d)


>>> kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
>>> func(**kwargs)                # ** 在函数调用中使用
1 2 3 4

三、几点注意


1.在函数定义时, * 表示打包,在函数体内部, * 表示的却是解包

>>> def foo(*args, **kwargs):
    print(args)       #未解包参数
    print(*args)      #解包参数


>>> v = (1, 2, 4)
>>> d = {'a':1, 'b':12}
>>> foo(v, d)
((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}


我们可以看到,在一开始,v,d作为整体被打包成了一个元祖,然后在解包回原来的形式。


我们再来看一个例子:

def foo(*args, **kwargs):
    print(args)       #未解包参数
    print(*args)      #解包参数
    print(kwargs)     #未解包参数
v = (1, 2, 4)
d = {'a':1, 'b':12}
foo(v, d,a=1,b=-2)

输出:

((1, 2, 4), {'a': 1, 'b': 12})
(1, 2, 4) {'a': 1, 'b': 12}
{'a': 1, 'b': -2}



此时,v,d由*args打包,然后解包,a=1,b=-2(关键字)由**kwargs打包。


2. * 和 ** 的打包和解包并不能脱离函数而存在

>>> c = {"name": 'zhang', "age": 2}
>>> **c
SyntaxError: invalid syntax
>>> 
>>> "Name:{name}, Age:{age}".format(**c)
'Name:zhang, Age:2'



注意:print()函数只支持 *args,不支持 **kwargs



版权声明:本文为weixin_43507744原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。