为什么要讲解包

因为我觉得解包是 Python 的一大特性,大大提升了编程的效率,而且适用性很广

啥是解包

  • 个人通俗理解:解开包袱,拿出东西
  • 正确理解:将元素从可迭代对象中一个个取出来
  • python 中,解包是自动完成的

最简单的解包栗子

a, b, c = [1, 2, 3]

print(a, b, c)

# 输出结果
1 2 3

列表有 3 个元素,此时也需要 3 个变量去接,否则会报错

a, b = [1, 2, 3]

# 输出结果
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)

太多值无法解包

重点

  • 除了列表可以解包,任何可迭代对象都支持解包
  • 比如:列表、元组、字典、集合、字符串、生成器,只要实现了 __next__ 方法的对象都是可迭代对象

可迭代对象详解

https://www.cnblogs.com/poloyy/p/14658433.html

各种解包栗子

元组解包

>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3

字符串解包

>>> a,b,c = "abc"
>>> a
'a'
>>> b
'b'
>>> c
'c'

集合解包

>>> a,b,c = {1,2,3}
>>> a
1
>>> b
2
>>> c
3

字典解包

>>> a,b,c = {"a":1, "b":2, "c":3}
>>> a
'a'
>>> b
'b'
>>> c
'c'

字典解包后,只会把字典的 key 取出来

多变量赋值

>>> a, b = 1, 2
>>> a
1
>>> b
2
  • 其实也是元组解包
  • 元组在 = 右边的时候,可以忽略 ( )

生成器解包

# 生成器
a, b, c = (x + 1 for x in range(3))
print(a, b, c) # 输出结果
1 2 3

生成器详解文章

https://www.cnblogs.com/poloyy/p/14664538.html

解决变量数不等于右侧可迭代对象中元素的个数

上面提到了这个报错问题

a, b = [1, 2, 3]

# 输出结果
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)

Python3 提供了解决方案

# 多变量
a, b, *c = [1, 2, 3, 4, 5]
print(a, b, c) # 输出结果
1 2 [3, 4, 5]
  • 在某个变量面前加一个星号
  • 而且这个星号可以放在任意变量
  • 每个变量都分配一个元素后,剩下的元素都分配给这个带星号的变量
# 多变量
a, b, *c, d = [1, 2, 3, 4, 5]
print(a, b, c, d) # 输出结果
1 2 [3, 4] 5

函数参数解包

主要是可变参数、关键字参数

详解文章:https://www.cnblogs.com/poloyy/p/12526592.html

函数详解文章:https://www.cnblogs.com/poloyy/p/15092393.html

解包小栗子一

# 函数
def test(a, b, c):
print(a, b, c) # 正常逐个传参
test(1, 2, 3) # 只传一个可迭代对象,就需要解包
test(*[1, 2, 3])
test(*{1, 2, 3})
test(*(1, 2, 3)) # 输出结果
1 2 3
1 2 3
1 2 3
1 2 3

解包小栗子二

# 函数
def test(a, b, c):
print(a, b, c) # 关键字传参
test(a=1, b=2, c=3) # 只传一个可迭代对象,就需要解包,和上面写法是等价的
test(**{"a": 1, "b": 2, "c": 3}) # 输出结果
1 2 3
1 2 3

Python 3.5+的新特性

  • 在 3.5 之前,函数调用时,一个函数中解包操作只允许一个 * 和一个 **
  • 3.5+ 之后,可以有任意多个解包
# 函数
def test(a, b, c, d, e, f):
print(a, b, c, d, e, f) test(*[1, 2, ], *[3, 4, ], **{"e": 5}, **{"f": 6}) # 输出结果
1 2 3 4 5 6

在表达式中使用解包

栗子一

# 表达式解包
print(range(3), 3)
print(*range(3), 3) print([*range(3), 3]) print({"a": 1, **{"b": 2, "c": 3}}) # 输出结果
range(0, 3) 3
0 1 2 3
[0, 1, 2, 3]
{'a': 1, 'b': 2, 'c': 3}

栗子二:拼接列表

# 解包拼接列表
list1 = [1, 2]
list2 = range(3, 5)
list3 = [*list1, *list2]
print(list3) # 输出结果
[1, 2, 3, 4]

list1 可以直接和 list2 做 + 操作吗?

不行,因为 list 无法与 range() 对象相加

栗子三:拼接两个字典

# 解包拼接字典
dict1 = {"a": 1, "b": 2}
dict2 = {"name": "yy", "age": 22}
dict3 = {**dict1, **dict2}
print(dict3) # 输出结果
{'a': 1, 'b': 2, 'name': 'yy', 'age': 22}

解包总结

  • 自动解包支持一切可迭代对象
  • 函数调用时,可以用 * 或者 ** 解包可迭代对象

拓展:Python 函数

https://www.cnblogs.com/poloyy/p/12526592.html

Python - 解包的各种骚操作的更多相关文章

  1. 关于Python 解包,你需要知道的一切

    解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来(防杠精:此处描述并不严谨,因为容器中的元素并没有发生改变)放在其它地方,好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员, ...

  2. Python解包参数列表及 Lambda 表达式

    解包参数列表 当参数已经在python列表或元组中但需要为需要单独位置参数的函数调用解包时,会发生相反的情况.例如,内置的 range() 函数需要单独的 start 和 stop 参数.如果它们不能 ...

  3. python解包

    概念 python的解包可以这样来理解:把元素给拆分并把其赋值给自己所需要的变量,因此元素应该是一个可迭代对象. 形式 简单版本 下面展示的是解包的基本形式,根据长度赋值给对应多的变量. name_l ...

  4. Python 中包/模块的 `import` 操作

    版权声明:博客为作者原创,允许转载,但必须注明原文地址: https://www.cnblogs.com/byronxie/p/10745292.html 用实例来说明 import 的作用吧. 创建 ...

  5. Python中的”黑魔法“与”骚操作“

    本文主要介绍Python的高级特性:列表推导式.迭代器和生成器,是面试中经常会被问到的特性.因为生成器实现了迭代器协议,可由列表推导式来生成,所有,这三个概念作为一章来介绍,是最便于大家理解的,现在看 ...

  6. 【Python从入门到精通】(九)Python中字符串的各种骚操作你已经烂熟于心了么?

    您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文将重点介绍Python字符串的各种常用方法,字符串是实际开发中经常用到的,所有熟练的掌握它的各种用法显得尤为重要. 干货满满,建议收藏,欢迎大 ...

  7. python list 中 remove 的骚操作/易错点

    在过去的某一天(2019.3.19),有个学弟问了一个关于python list中的一个问题: 比如我们已知一个列表 [3,4,5,6,5,4,3] 我们想删除第一个为3的元素. 我们尝试了如下几种方 ...

  8. python高级特性之封包与解包

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:kwsy PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  9. Python 序列与映射的解包操作

    解包就是把序列或映射中每个元素单独提取出来,序列解包的一种简单用法就是把首个或前几个元素与后面几个元素分别提取出来,例如: first, seconde, *rest = sequence 如果seq ...

随机推荐

  1. MaterialDesignInXamlToolkit“无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容”异常的解决思路

    前言: 最初是想解答园友"小代码大世界 "的问题,后来想举一反三,将这个问题简单剖析下,做到知其所以然. MaterialDesignInXAML 控件库高度封装,有一些控件在使用 ...

  2. c++实现希尔密码

    实验名称: 希尔密码的实现(c++版;本文只以26个大写英文字符作为加密后的密文的可选项) 实验原理: 引用知识: 记 Zm={0,1,2,...,m-1} 定义1:设A为定义在集合Zm 上的n阶方阵 ...

  3. 【Linux】通过shell脚本对mysql的增删改查以及my.cnf的配置

    目录 shell操作mysql 1.获取mysql默认密码 2.修改my.cnf文件 3.shell创建mysql数据库 4.shell创建mysql表 5.shell添加数据 6.shell删除数据 ...

  4. 30、css介绍

    30.1.css概述: css是Cascading Style Sheet的简称,中文称为层叠样式表,是用来控制网页数据表现的,可以 使网页的表现与数据内容分离: 30.2.css的四种引入方式: 1 ...

  5. 升级Ubuntu 16.04 到 Ubuntu 18.04 的方法

    特别注意,在进行升级前,请做好重要数据备份工作,防止升级失败或者其他奇怪原因,导致数据丢失或损坏 sudo vim /etc/apt/sources.list 将 http://archive.ubu ...

  6. 为什么要鼓励小型企业使用CRM系统

    如果你是一家小公司的管理者,我相信你必须对工作流程.客户.市场销售.市场营销推广等业务流程进行总体规划和管理方法,这往往会使你的心有馀而力不足,引起 繁忙.心有馀而力不足.交流受到阻碍.管理方法和这样 ...

  7. Centos 8 上定时备份Gitlab ,脚本实现定时备份,备份恢复

    定时备份 要求 为了能够备份和恢复,请确保你的系统上安装了Rsync yum install rsync -y 配置备份目标机器免密认证 执行ssh-keygen -t rsa 生成私钥和公钥 ssh ...

  8. CentOS-自定义SFTP用户及目录

    ftp功能说明:通过SSH启动CentOS的sftp功能 创建用户组及用户(sftp可变) $ groupadd sftp $ useradd -g sftp -s /sbin/nologin -d ...

  9. 解决mount.nfs: access denied by server while mounting

    在linux下进行挂载时突然出现: mount.nfs: access denied by server while mounting  第一感觉是读取文件权限不够,准备去更改一下挂载点的权限,但又考 ...

  10. 160crackme002

    一.查壳 结果:vb写的,并且无壳 二.运行程序 发现了这个程度调用了vb调用窗口的api.这时有两种方式: 1.再重新调试,运行到有窗口的时候,F12暂停,按ctrl+K,查看dll调用,再数据窗口 ...