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

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:

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

结果:

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

关键字参数**kwargs

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

结果:

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

解包

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

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

结果:

[1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}
--------------------------------------------------
1
2
3
a
b
c
--------------------------------------------------
1
2
3
a 1
b 2
c 3

问题:

  1. 在传入参数时,可变参数(*)之前不能指定参数名
def myfun(a, *b):print(a)print(b)
myfun(a=1,2,3,4)myfun(a=1,2,3,4)^
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=6, c=3, d=4, e=5)     # 记住可变参数(*)之前不能指定参数名1
(2,)
3
{'w': 6, 'd': 4, 'e': 5}

python中的装包与解包*,**相关推荐

  1. Python中的打包与解包

     解包:Unpacking,比如你儿子去买包子回来分给你的家人. a, *b, c = [1, 2, 3, 4, 5] print(a) # 1 print(b) # [2, 3, 4] print( ...

  2. Python中self用法详解

    Python中self用法详解 https://blog.csdn.net/CLHugh/article/details/75000104 首页 博客 学院 下载 图文课 论坛 APP 问答 商城 V ...

  3. python中的字符串详解(附实现文字跑马灯效果)

    python中的字符串详解 1.什么是字符串 ​ 相信大家对字符串应该是再熟悉不过了吧,因为日常生活中的一句话,或是路边的一则广告,其实它都相当于一个字符串,而顾名思义,字符串也就是一串串的由零个或多 ...

  4. python中的GIL详解

    python中的GIL详解 参考Python-- GIL 锁简述 GIL是什么 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念.就 ...

  5. python正确的赋值语句-Python 赋值语句技巧之序列解包

    python赋值语句技巧之序列解包sequence unpacking,是python语言赋值语句的一种技巧方法,在给多个python 变量命名同时赋值时是很有效率的一种方法. 赋值语句序列解包概念 ...

  6. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  7. 【 Python 中 int 用法详解】(转载)

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  8. Python 中 int 用法详解

    Python 中 int 用法详解 欢迎转载,转载请注明出处! 文章目录 Python 中 int 用法详解 0. 参考资料 1. int 的无参数调用 2. int 接收数字作为参数 3. int ...

  9. matlab求最小范数解,python中计算最小范数解或伪逆解最精确的方法是什么?

    我的目标是解决:Kc=y 对于伪逆(即最小范数解): ^{pr2}$ 这样模型(希望)是高次多项式模型f(x) = sum_i c_i x^i.我特别感兴趣的是我们有更多的多项式特征比数据(少方程太多 ...

最新文章

  1. 用 Python 实现一个大数据搜索引擎
  2. vim命令杂烩(复制粘贴、建文件、撤销等)
  3. 《深入体验 飞鸽传书 开发内幕 核心基础》
  4. GCC同时使用静态库和动态库链接
  5. docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
  6. 85、android handler的警告Handler Class Should be Static or Leaks Occur
  7. 查找 -- 7.1 Sear for a Range -- 图解
  8. pycharm 变量批量重命名
  9. IM消息重试机制Java实现_消息的重试机制的设计思路
  10. 学弟学妹看我文章顺利毕业,基于HTML+Javascript五子棋人机博弈系统设计与实现《记得收藏》
  11. 微波雷达感应模块技术应用,多普勒雷达,人体存在感应模组
  12. Xenu工具的简单使用
  13. CSS动画:梦幻西游
  14. python换发型_初学Python的一些细节
  15. HIVE获取时间函数, regexp_extract正则提取用法
  16. android 视频大小压缩,Android视频压缩(亲测有效)方便简单易用
  17. .mdf mysql数据库,sql server mdf 数据库文件导入 mysql
  18. 纯净版Win10系统重装教程(超详细)
  19. Apache Hue基础知识大全
  20. airodump-ng界面参数比较详细的解释

热门文章

  1. 【STM32】获取STM32官方固件库
  2. 2019年中国社交电商行业市场分析:社交电商巨头已浮出水面
  3. Ubuntu 20.04 Desktop 设置桌面图标大小、间距
  4. python京东预约抢购_京东抢购脚本js教程
  5. 低成本2.4G SOC(NYA054E)灯控遥控芯片方案-CI2454/CI2451
  6. 高性能本地缓存Ristretto(二)——过期策略
  7. app.json: [“subpackages“][0][“root“] 字段需为 目录
  8. 频域分析中的三频段理论
  9. std::thread vs CreateThread
  10. rk3568和rk3399性能对比 rk3568和rk3399区别