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

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对可迭代解包的改进及用法详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • Python3.8中使用f-strings调试

    前言 我日常开发大概有98%的情况下会使用print来调试(别说pdb之类的, 根本不实用),通过在合适的位置插入print语句打印出要跟踪的表达式或者变量的值来确认问题.f-string让格式化这件事变得美观简单,但是依然对调试毫无帮助. 我举个例子: s = 'A string' value = 123 如果你想看运行时s和value的值分别是多少(PS: 这里演示的是常量,在实际代码执行中可能他们是表达式或者函数调用计算出来的,那时它们就是动态的了),可以在代码中加一行print打印一下它

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

    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)]:

  • Python包管理工具pip用法详解

    pip提供我们各色各样的软件(第三方库),而这些第三方库又可以给我们实现各种各样不同的功能,科学计算.画图.操作文件.聊天…… 我们可以通过Cmd终端.Pycharm.Jupyter三种平台使用pip安装这些第三方库. 官方Python 第三方库软件包地址:PyPI · Python 包索引 Anaconda,Conda,Pip的关系 Anaconda是一个python发行版.软件发行版是在系统上提前编译和配置好的软件包集合, 装好了后就可以直接用. Conda是一个包管理器.包管理器是自动化软

  • Java中DecimalFormat用法详解

    我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; public class TestNumberFormat{ public static void main(String[]args){ doublepi=3.1415927; //圆周率 //取一位整数 System.out.println(newDecimalForm

  • DecimalFormat数字格式化用法详解

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字. DecimalFormat 包含一个模式 和一组符号 符号含义: 下列字符用在非本地化的模式中.已本地化的模式使用从此 formatter 的 DecimalFormatSymbols 对象中获得的相应字符,这些字符已失去其特殊状态.两种例外是货币符号和引号,不将其本地化. import java.text.DecimalFormat; public class TestDecimalFormat

  • DecimalFormat多种用法详解

    NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格式化一个数字.你也可以使用非缺省的地区设置,例如德国.然后格式化方法根据特定的地区规则格式化数字.这个程序也可以使用一个简单的形式: NumberFormat.getInstance().format(1234.56) 但是保存一个格式然后重用更加有效.国际化是格式化数字时的一个大问题. 另一个是对

  • python压包的概念及实例详解

    对于一些分解后的元素,我们也是有重新归类的需要.那么我们把解包的恢复过程,叫做压包.这里要用到zip函数的方法,对元素重新进行打包处理,在之前的学习中我们已经对zip函数有所接触.下面我们就python压包的概念.方法进行介绍,然后带来相关的实例使用. 1.概念 压包是解包的逆过程,用zip函数实现. 2.方法 (1)zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象(Python3). (2)如果各个迭代器的元素个数不一致,则返回列表长

  • Python3网络爬虫中的requests高级用法详解

    本节我们再来了解下 Requests 的一些高级用法,如文件上传,代理设置,Cookies 设置等等. 1. 文件上传 我们知道 Reqeuests 可以模拟提交一些数据,假如有的网站需要我们上传文件,我们同样可以利用它来上传,实现非常简单,实例如下: import requests files = {'file': open('favicon.ico', 'rb')} r = requests.post('http://httpbin.org/post', files=files) print

  • Python3之字节串bytes与字节数组bytearray的使用详解

    字节串bytes 字节串也叫字节序列,是不可变的序列,存储以字节为单位的数据 字节串表示方法: b"ABCD" b"\x41\x42" ... 字节串的构造函数: bytes() 创建一个空的字节串 ,同b"" bytes(整数可迭代对象) 用可迭代对象创建一个字节串 bytes(整数n) 生成n个值为0的字节串 bytes(字符串,encoding='utf-8') 转码 字节串的运算:同其他序列的运算 +.+=.*.*= <.<=

  • java动态添加外部jar包到classpath的实例详解

    java动态添加外部jar包到classpath的实例详解 前言: 在项目开发过程中我们有时候需要动态的添加外部jar包,但是具体的业务需求还没有遇到过,因为如果动态添加外部jar包后,我们就需要修改业务代码,而修改代码就需要重新启动服务,那样好像就没有必要动态添加外部jar包了,怎么样才能不重新启动服务器就可以使用最新的代码我没有找到方法,如果各位知道的话给我点建议,回归主题,实现动态添加外部jar包到classpath的方法如下: String beanClassName = "com.dy

  • 使用yum查看工具lspci所在包并安装的方法(详解)

    摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具.一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型.本文描述了在一个虚拟机中安装lspci工具的具体步骤. 由于要测试虚拟机上的不同的虚拟网卡驱动类型的传输效率,所以需要变化虚拟机的虚拟网卡类型,并且利用lspci工具验证是否加载成功. 虚拟机操作系统:CentOS6.0 i386. 启动虚拟机后,键入lspci,系统提示没有这个命令.于是想到先安装这个工具再测试.安装过程需要解决几个问题:安装源?lspci属于哪个包

随机推荐