Python3.8对可迭代解包的改进及用法详解


Posted in Python onOctober 15, 2019

Python 3 的可迭代解包

在 PEP 3132 - Extended Iterable Unpacking 里面描述了一种对可迭代对象的解包用法,Python 3 可用:

In : a, *b, c = range(5)
In : a, c
Out: (0, 4)
In : b
Out: [1, 2, 3]
In : *a, = range(5)
In : a
Out: [0, 1, 2, 3, 4]
In : for a, *b in [(1, 2, 3), (4, 5, 6, 7)]:
...:   print(b)
...:
[2, 3]
[5, 6, 7]

挺方便的,ES6 也有对应的destructuring assignment语法实现解包数组,不过人家实现的更彻底,还可以解包对象。

不过在 Python 3.2 时引入了一个 BUG。看一个例子:

In : def a():
...:   rest = (4, 5, 6)
...:   t = 1, 2, 3, *rest
...:   return t
...:

In : for i in a():
...:   print(i)
...:

其实这是一个非常简化的写法,要不然需要把 1,2,3 放在一个元组中,再 + rest:

In : (1, 2, 3) + (3, 4, 5, 6)
Out: (1, 2, 3, 4, 5, 6)

但是上面这个例子稍微改一下:

In : def b():
...:   rest = (4, 5, 6)
...:   return 1, 2, 3, *rest
File "<ipython-input-38-b5a7115853e2>", line 3
 return 1, 2, 3, *rest
          ^
SyntaxError: invalid syntax

不用变量 t, 直接返回就会抛 SyntaxError,另外就是 yield (当然要注意 return 和 yield 本身的意见不同啊):

In : def c():
...:   rest = (4, 5, 6)
...:   yield 1, 2, 3, *rest
File "<ipython-input-39-cf6991fcff64>", line 3
 yield 1, 2, 3, *rest
          ^
SyntaxError: invalid syntax
Python 3.8

在 Python 3.8,修复了这个问题:

>>> def b():
...   rest = (4, 5, 6)
...   return 1, 2, 3, *rest
...
>>> for i in b():
...   print(i)
...
>>> def c():
...   rest = (4, 5, 6)
...   yield 1, 2, 3, *rest
...
>>> for i in c():
...   print(i)
...
(1, 2, 3, 4, 5, 6)

你学到了么?

延伸阅读

总结

以上所述是小编给大家介绍的Python3.8对可迭代解包的改进及用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
通过数据库向Django模型添加字段的示例
Jul 21 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
Python绘制3D图形
May 03 Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Django的CVB实例详解
Feb 10 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
python中time.ctime()实例用法
Feb 03 Python
如何用python插入独创性声明
Mar 31 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 #Python
Python3安装pip工具的详细步骤
Oct 14 #Python
python区分不同数据类型的方法
Oct 14 #Python
django中瀑布流写法实例代码
Oct 14 #Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 #Python
python实现文件批量编码转换及注意事项
Oct 14 #Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 #Python
You might like
PHP生成UTF8文件的方法
2010/05/15 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
2013/08/07 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
php 实现银联商务H5支付的示例代码
2019/10/12 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
js函数返回多个返回值的示例代码
2013/11/05 Javascript
Jquery validation remote 验证的缓存问题解决方法
2014/03/25 Javascript
一个不错的js html页面倒计时可精确到秒
2014/10/22 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
jQuery实现选项联动轮播效果【附实例】
2016/04/19 Javascript
jQueryUI Datepicker组件设置日期高亮
2016/10/13 Javascript
jQuery插件FusionCharts实现的2D饼状图效果【附demo源码下载】
2017/03/03 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
JavaScript的数据类型转换原则(干货)
2018/03/15 Javascript
vue添加axios,并且指定baseurl的方法
2018/09/19 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
Python列表删除的三种方法代码分享
2017/10/31 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
用C或者C++语言实现SOCKET通信
2015/02/24 面试题
国际贸易专业个人求职信格式
2014/02/02 职场文书
2014全国两会心得体会
2014/03/17 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
Redis中key的过期删除策略和内存淘汰机制
2022/04/12 Redis
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js