python封包

当多个元素赋值给一个变量时,python会自动将这些值封装成元组,这个特性称之为封包

a = 1, True, ['a', 'b'], {'age': 18}
print(a, type(a))
# (1, True, ['a', 'b'], {'age': 18}) <class 'tuple'>

当某个函数返回多个数值时,也会进行封包操作

def tP():return 'a', 'b', 666
b = tP()
print(b, type(b))
# ('a', 'b', 666) <class 'tuple'>

python解包 - Unpack

Function calls are proposed to support an arbitrary number of unpackings rather than just one:

>>> print(*[1], *[2], 3)
1 2 3
>>> dict(**{'x': 1}, y=2, **{'z': 3})
{'x': 1, 'y': 2, 'z': 3}

Unpacking is proposed to be allowed inside tuple, list, set, and dictionary displays:

>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4}
{0, 1, 2, 3, 4}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}

In dictionaries, later values will always override earlier ones:

>>> {'x': 1, **{'x': 2}}
{'x': 2}>>> {**{'x': 2}, 'x': 1}
{'x': 1}

将一个包含多个元素的序列中的元素赋值给多个变量,例如 list ,每个元素当成一个个个体剥离出来,这个过程就是解包

  • 列表解包,将list中每个元素赋值给某一个变量

>>> a, b, c = ['alex', 'andy', 'lucy']
>>> a
'alex'
>>> b
'andy'
>>> c
'lucy'

只要对象是可迭代的,就可以解包操作,可迭代对象包括元组、字典、集合、字符串、生成器等

  • 元组解包
>>> a,b,c = (1, True, ['alex','andy'])
>>> a
1
>>> b
True
>>> c
['alex', 'andy']
  • 字符串解包
>>> a, b, c ,d = "alex"
>>> a
'a'
>>> b
'l'
>>> c
'e'
>>> d
'x'
  • 字典解包

序列解包用于字典时, 默认是对 ’ 键 ’ 进行操作;如果需要对 ’键值对‘ 操作, 则需要使用 items();如果需要对 ’ 值 ’ 进行操作, 则需要使用 values()

1、序列解包用于字典时, 默认是对 ’ 键 ’ 进行操作

>>> a,b,c = {"name": "alex", "age":18, "hobby": "man"}
>>> a
'name'
>>> b
'age'
>>> c
'hobby'
>>> a,b,c    # 可以看到,只能拿到 key 值,value 则丢掉了
('name', 'age', 'hobby')

2、如果需要对 ’键值对‘ 操作, 则需要使用 items()

>>> for key,value in my_dict.items():
...     print(key,value)
...
name alex
age 18
hobby man

3、 如果需要对 ’ 值 ’ 进行操作, 则需要使用 values()

>>> for value in my_dict.values():
...     print(value)
...
alex
18
man
  • 生成器解包

>>> a, b, c = (x + 10 for x in range(3))
>>> a
10
>>> b
11
>>> c
12

注意:用来接收的变量必须与元素数目保持一致,否则会报错~

>>> a ,b, c = 1,2,3,4,5
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 3)

那这种情况怎么解决呢?? 引入参数 ‘*’ 与 ‘* *’

解包之星号 * 的使用

如果可迭代对象包含的元素和前面待赋值变量数量不一致,则会报错。但是可以通过 * 来表示多个元素

在Python2中,如果等号左边变量的个数不等于右边可迭代对象中元素的个数,是不允许解包的。但在 Python3 可以这么做了

详细参见官方文档 pep-3132

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

这种做法 确实 很飒!! 在python2 中还得通过 列表切片来实现

>>> num = [1,2,3,4,5]
>>> a,b,c = num[0],num[1],num[2:]
>>> a
1
>>> b
2
>>> c
[3, 4, 5]
  • 两个星 ** ,Python 3.x 3.5及以后
    打开字典包 使用两个相邻的星 (pep-0448)
>>> tail = {'y': 2, 'z': 3}
>>> {'x': 1, **tail}# {'x': 1, 'y': 2, 'z': 3}

如何优雅的合并两个字典??

巧妙的利用**解包技术,可以简单方便的将两个字典合并到一个新字典中

>>> dict1 = {"name": "alex"}
>>> dict2 = {"age": 18}
>>> dict3 = {**dict1, **dict2}
>>> dict3
{'name': 'alex', 'age': 18}
>>>

https://foofish.net/python-unpacking.html
https://zhuanlan.zhihu.com/p/33896402
https://www.python.org/dev/peps/pep-0448/

_ 的使用

用 _ 表示一些用不到的某些元素,这种表达方式言简意赅、代码易读性高

>>> q, *_ =  [1,2,3]
>>> q
1>>> q, _, _ = [1,2,3]
>>> q
1
>>> q, *_ ,p=  [1,2,3,4,5]
>>> q
1
>>> p
5
>>> *_, r = [1,2,3,4,5]
>>> r
5
>>>
>>> person = ('alex' , 18, 'man', (7, 26, 2020))
>>> name, *_, (*_, year) = person
>>> name
'alex'
>>> year
2020
>>>

python中一切可迭代对象都支持解包 - Iterable Unpacking相关推荐

  1. python中可迭代对象_什么是python中的可迭代对象(iterable object)?

    我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...

  2. 怎么确定迭代器后面还有至少两个值_如何理解Python中的可迭代对象、迭代器和生成器

    ▍前言 在讨论可迭代对象.迭代器和生成器之前,先说明一下迭代器模式(iterator pattern),维基百科这么解释: 迭代器是一种最简单也最常见的设计模式.它可以让用户透过特定的接口巡访容器中的 ...

  3. 玩转Python中迭代器与迭代对象的使用与演示

    0.什么是迭代器(iterator)与迭代对象? 比如:python中的集合数据类型,如 list . tuple . dict . set . str 等,我们可以使用for遍历其中的每个元素,此外 ...

  4. python中对象不可迭代_【转】Python中自定义可迭代对象

    python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...

  5. python中的可迭代对象

    迭代是访问集合元素的⼀种⽅式.迭代器是⼀个可以记住遍历的位置的对象.迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1.    可迭代对象 我们已经知道可以 ...

  6. Python中的可迭代对象和迭代器

    可迭代对象和迭代器 什么是可迭代对象(Iterable)? 可作用于for循环的对象.(即内部实现了__iter__()函数的对象) 例如:创建一个列表l,列表l中的数据可以通过for循环方式索要(即 ...

  7. 在Python中,如何确定对象是否可迭代?

    有没有类似isiterable的方法? 到目前为止,我发现的唯一解决方案是致电 hasattr(myObj, '__iter__') 但是我不确定这有多愚蠢. #1楼 根据Python 2词汇表 ,可 ...

  8. SICP2——Python中使用函数构建对象

    一.使用对象构建抽象 1.1 数据抽象 现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示对象.-根本不必考虑它们到底代表着什么东西. 上一篇文章主要强调的是对数据的操作以及这些操作之间的组合与 ...

  9. 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...

    Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...

最新文章

  1. ORB-SLAM3 论文笔记
  2. redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...
  3. visual paradigm 表示选择关系_css3选择器用法介绍
  4. 「镁客·请讲」天宝陈朝晖:AI 的准确译法不是人工智能,而是机器智能...
  5. java int byte数组_Java 中int与byte数组转换详解
  6. Android Kotlin协程和Retrofit结合使用
  7. provider android简书,Android 使用ContentProvider在应用间共享数据
  8. python的回收机制_Python垃圾回收机制【人生苦短,我用python】-阿里云开发者社区...
  9. 【独家:震惊!——西城区所有学区优质度透解与大排名,泄密了!】
  10. mvc html 生成图片,asp.net mvc5 cs代码中获取视图生成后的HTML
  11. “约见”面试官系列之常见面试题之第七十六篇之vue-router中的路由钩子函数基本用法 (建议收藏)
  12. 如何选择合适的Web安全网关?
  13. IO对象流(序列化和反序列化)
  14. python个人微信支付接口_Python实现微信小程序支付功能
  15. 2015-12-01 SQL查询语句基础
  16. exchange 2003 event id 1221
  17. 68.x的平方根(力扣leetcode) 博主可答疑该问题
  18. pvs、pvdisplay、pvscan 查看物理卷信息
  19. 银行电话精准营销的探索性分析并基于XGboost进行潜在客户预测建模
  20. 织梦Dedecms忘记管理员后台密码解决办法

热门文章

  1. VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等
  2. Maven的seting配置及命令
  3. 最受欢迎的Python开源框架有哪些?
  4. 高校社团管理系统jsp和javabean开发
  5. ATmi-G 公众号机器人 【永久免费】
  6. 详细图解如何注册 Navicat for Mysql 11.0.17 企业版(Win7 64bit)
  7. centos上启动mysql_centos下怎么启动mysql
  8. Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
  9. P14-Vue-supermall项目-BetterScroll滚动插件基本使用
  10. MATLAB文件操作