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函数式编程指南(四):生成器详解
Jun 24 Python
Python找出9个连续的空闲端口
Feb 01 Python
Python unittest 简单实现参数化的方法
Nov 30 Python
对python生成业务报表的实例详解
Feb 03 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
Jul 08 Python
pip指定python位置安装软件包的方法
Jul 12 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
Python count函数使用方法实例解析
Mar 23 Python
Django使用Profile扩展User模块方式
May 14 Python
利用python 读写csv文件
Sep 10 Python
Python 循环读取数据内存不足的解决方案
May 25 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 接口类与抽象类的实际作用
2009/11/26 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
浅谈ThinkPHP中initialize和construct的区别
2017/04/01 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
jQuery Validate初步体验(一)
2015/12/12 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
Vue2.0用户权限控制解决方案
2017/11/29 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
2018/07/15 Javascript
解决百度Echarts图表坐标轴越界的方法
2018/10/17 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
[01:02:17]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG
2014/05/26 DOTA
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
[01:00:25]NB vs Secret 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
python去除扩展名的实例讲解
2018/04/23 Python
python 统计列表中不同元素的数量方法
2018/06/29 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
openCV提取图像中的矩形区域
2020/07/21 Python
英国最好的包装供应商:Priory Direct
2019/12/17 全球购物
2014个人年度工作总结
2014/12/15 职场文书
党小组意见范文
2015/06/08 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2016新年致辞
2015/08/01 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
Flutter Navigator 实现路由传递参数
2022/04/22 Java/Android