分享

python中的装包与解包*,**

 xiaoyimin 2019-12-11

学习过程中遇到了*解包的过程,很感兴趣,于是实验一番,

a = (1, 2, 3, 4, 5, 6)b = [2, 3, 4, 5, 5, 6]c = {'name': 'zhang', 'age': 2}
print(*a)print(*b)print(*c)

结果 :

1 2 3 4 5 6
2 3 4 5 5 6
name age

结果和想象中差不多,只有字典的结果,不太满意,所以我又尝试** 

print(**c)

结果:

    print(**c)
TypeError: 'name' is an invalid keyword argument for this function 

为什么打印不出来呢,我在学习过程中看到的代码是可以用**来解字典的,后来又看到了下面这个

 print('Name:{name}, Age:{age}'.format(**c))

结果:

 Name:zhang, Age:2

那么,为什么放在format里面就行,而print不行呢

经过多次验证,原来**解出来的数据是这样的 

 **c = name='zhang',age=2

而print只支持*args,不支持**kwargs,如下源码:

def print(self, *args, sep=' ', end='\n', file=None): # known special case of print

注意点:

**只能解mapping,也就是映射型的数据,python中暂时好像我就知道字典是,如果解列表或者元祖,则如下:

    print(**b)
TypeError: print() argument after ** must be a mapping, not list

以上是自己尝试的过程,

以下是原作者的文章:

 https://blog.csdn.net/qq_1290259791/article/details/80964432

*args和 **kwargs是常用的两个参数

  1. *args:用于接受多余的未命名的参数,元组类型。
  2. **kwargs:用于接受形参的命名参数,字典类型的数据。

可变参数args:

  1. def fun(n, *args):
  2. print(n)
  3. print(args) # 未拆包
  4. print(*args) # 进行拆包
  5. fun(1,2,3,4)

结果:

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

关键字参数**kwargs

  1. def fun(**kwargs):
  2. print(kwargs) # 未拆包
  3. print(*kwargs) # 进行拆包
  4. fun(a=1, b=2)

结果:

  1. {'a': 1, 'b': 2}
  2. a b
  1. *args用来接受多余的未命名参数, **kwargs是用来接受命名参数。
  2. 装包的意义就是把未命名的参数和命名的参数放在元组或字典中。

解包

上面介绍了args, kwargs的装包作用,起到作用的是、 这两个参数。

  1. 1. 解包的意义就是将传递给函数的一个列表,元组,字典,拆分成独立的多个元素然后赋值给函数中的参变量。
  2. 2. 解压字典有两种解发,一种用*解的只有key,一种用**解的有key,value。但是这个方法**只能在函数定义中使用。
  1. def fun(*args, **kwargs):
  2. for arg in args:
  3. print(arg)
  4. for k, v in kwargs.items():
  5. print(k, v)
  6. print('-'*50)
  7. fun(a, c) # 参数都赋值给args,并没有kwargs的参数
  8. fun(*a, *c) # 解压的参数都赋值给args 等价为 1, 2, 3, 'a', 'b', 'c'
  9. fun(*a, **c) # a解压给args,c解压给kwargs 等价为 1, 2, 3, 'a'=1, 'b'=2, 'c'=3

结果:

  1. [1, 2, 3]
  2. {'a': 1, 'b': 2, 'c': 3}
  3. --------------------------------------------------
  4. 1
  5. 2
  6. 3
  7. a
  8. b
  9. c
  10. --------------------------------------------------
  11. 1
  12. 2
  13. 3
  14. a 1
  15. b 2
  16. c 3

问题:

  1. 在传入参数时,可变参数(*)之前不能指定参数名
  1. def myfun(a, *b):
  2. print(a)
  3. print(b)
  4. myfun(a=1,2,3,4)
  5. myfun(a=1,2,3,4)
  6. ^
  7. SyntaxError: positional argument follows keyword argument

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

  1. def myfun(a, *b, c=None):
  2. print(a)
  3. print(b)
  4. print(c)
  5. myfun(1,2,3,c=4)
  6. 1
  7. (2, 3)
  8. 4

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

  1. def myfun(*, a, b):
  2. print(a)
  3. print(b)
  4. myfun(a=1, b=2)
  5. 1
  6. 2

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

  1. def myfun(a, *b, c, **d):
  2. print(a)
  3. print(b)
  4. print(c)
  5. print(d)
  6. myfun(1, 2, w=6, c=3, d=4, e=5) # 记住可变参数(*)之前不能指定参数名
  7. 1
  8. (2,)
  9. 3
  10. {'w': 6, 'd': 4, 'e': 5}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多