python中一切可迭代对象都支持解包 - Iterable Unpacking
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相关推荐
- python中可迭代对象_什么是python中的可迭代对象(iterable object)?
我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...
- 怎么确定迭代器后面还有至少两个值_如何理解Python中的可迭代对象、迭代器和生成器
▍前言 在讨论可迭代对象.迭代器和生成器之前,先说明一下迭代器模式(iterator pattern),维基百科这么解释: 迭代器是一种最简单也最常见的设计模式.它可以让用户透过特定的接口巡访容器中的 ...
- 玩转Python中迭代器与迭代对象的使用与演示
0.什么是迭代器(iterator)与迭代对象? 比如:python中的集合数据类型,如 list . tuple . dict . set . str 等,我们可以使用for遍历其中的每个元素,此外 ...
- python中对象不可迭代_【转】Python中自定义可迭代对象
python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...
- python中的可迭代对象
迭代是访问集合元素的⼀种⽅式.迭代器是⼀个可以记住遍历的位置的对象.迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1. 可迭代对象 我们已经知道可以 ...
- Python中的可迭代对象和迭代器
可迭代对象和迭代器 什么是可迭代对象(Iterable)? 可作用于for循环的对象.(即内部实现了__iter__()函数的对象) 例如:创建一个列表l,列表l中的数据可以通过for循环方式索要(即 ...
- 在Python中,如何确定对象是否可迭代?
有没有类似isiterable的方法? 到目前为止,我发现的唯一解决方案是致电 hasattr(myObj, '__iter__') 但是我不确定这有多愚蠢. #1楼 根据Python 2词汇表 ,可 ...
- SICP2——Python中使用函数构建对象
一.使用对象构建抽象 1.1 数据抽象 现在到了数学抽象中最关键的一步:让我们忘记这些符号所表示对象.-根本不必考虑它们到底代表着什么东西. 上一篇文章主要强调的是对数据的操作以及这些操作之间的组合与 ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
最新文章
- ORB-SLAM3 论文笔记
- redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...
- visual paradigm 表示选择关系_css3选择器用法介绍
- 「镁客·请讲」天宝陈朝晖:AI 的准确译法不是人工智能,而是机器智能...
- java int byte数组_Java 中int与byte数组转换详解
- Android Kotlin协程和Retrofit结合使用
- provider android简书,Android 使用ContentProvider在应用间共享数据
- python的回收机制_Python垃圾回收机制【人生苦短,我用python】-阿里云开发者社区...
- 【独家:震惊!——西城区所有学区优质度透解与大排名,泄密了!】
- mvc html 生成图片,asp.net mvc5 cs代码中获取视图生成后的HTML
- “约见”面试官系列之常见面试题之第七十六篇之vue-router中的路由钩子函数基本用法 (建议收藏)
- 如何选择合适的Web安全网关?
- IO对象流(序列化和反序列化)
- python个人微信支付接口_Python实现微信小程序支付功能
- 2015-12-01 SQL查询语句基础
- exchange 2003 event id 1221
- 68.x的平方根(力扣leetcode) 博主可答疑该问题
- pvs、pvdisplay、pvscan 查看物理卷信息
- 银行电话精准营销的探索性分析并基于XGboost进行潜在客户预测建模
- 织梦Dedecms忘记管理员后台密码解决办法
热门文章
- VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等
- Maven的seting配置及命令
- 最受欢迎的Python开源框架有哪些?
- 高校社团管理系统jsp和javabean开发
- ATmi-G 公众号机器人 【永久免费】
- 详细图解如何注册 Navicat for Mysql 11.0.17 企业版(Win7 64bit)
- centos上启动mysql_centos下怎么启动mysql
- Python数据结构20:动态规划:找零兑换问题的动态规划解法并显示使用的硬币组合
- P14-Vue-supermall项目-BetterScroll滚动插件基本使用
- MATLAB文件操作