Python函数中的解包与装包

我们在python代码中常常会看到函数带有 *args**kwargs 这两个参数,他们是是常用的两个参数。
*args :用于接受多余的未命名的参数,元组类型。
**kwargs :用于接受形参的命名参数,字典类型的数据。

原文链接:https://blog.csdn.net/qq_1290259791/article/details/80964432 


可变参数 args 

>>> def fun(n, *args):
...     print(n)
...     print(args)
...     print(*args)
...
>>> fun(1,2,3,4)
1
(2, 3, 4)
2 3 4

形参中的*args是接受数据的args,它是一个元组,把传入的数据放进args元组中。函数中的args仍然是元组, *args就是将元组的数据进行拆包,一开始输入的形式。

关键字参数**kwargs

>>> def fun(**kwargs):
...     print(kwargs)
...     print(*kwargs)
...
>>> fun(a=1,b=3)
{'a': 1, 'b': 3}
a b

*args用来接受多余的未命名参数, **kwargs是用来接受命名参数

装包的意义就是把未命名的参数和命名的参数放在元组或字典中。


解包
上面介绍了args, kwargs的装包作用,起到作用的是、 这两个参数。1. 解包的意义就是将传递给函数的一个列表,元组,字典,拆分成独立的多个元素然后赋值给函数中的参变量。
2. 解压字典有两种解发,一种用*解的只有key,一种用**解的有key,value。但是这个方法**只能在函数定义中使用
 

>>> list = [1,2,3]
>>> dictionary = {'a':1, 'b':2, 'c':3}
>>> def fun(*args, **kwargs):
...     for arg in args:
...             print(arg)
...     for k,v in kwargs.items():
...             print(k,v)
...     print('*' * 50)
...
>>> fun(list, dictionary)
[1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}
**************************************************
>>> fun(*list, *dictionary)
1
2
3
a
b
c
**************************************************
>>> fun(*list, **dictionary)
1
2
3
a 1
b 2
c 3
**************************************************



问题:
1.在传入参数时,可变参数(*)之前不能指定参数名

>>> def myfun(a, *b):
...     print(a)
...     print(b)
...
>>> myfun(a=1,2,3,4)
  File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument


2.函数传入实参时,可变参数(*)之后的参数必须指定参数名,否则就会被归到可变参数之中,这就是仅限关键字参数

>>> def myfun(a, *b, c=None):
...     print(a)
...     print(b)
...     print(c)
...
>>> myfun(1,2,3,c=4)
1
(2, 3)
4


3.一个函数想要使用时必须明确指定参数名,可以将所有参数都放在可变参数之后

>>> def myfun(*, a,b):
...     print(a)
...     print(b)
...
>>> myfun(a=1, b=2)
1
2


4.关键字参数都只能作为最后一个参数,前面的参数按照位置赋值还是名称赋值都可以

>>> def myfun( a,*b, c, **d):
...     print(a)
...     print(b)
...     print(c)
...     print(d)
...
>>> myfun(1,2,w=5, c=3, d=4, e=6)
1
(2,)
3
{'e': 6, 'w': 5, 'd': 4}

猜你喜欢

转载自blog.csdn.net/fang_chuan/article/details/87516362
今日推荐