经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
Python3.8对可迭代解包的改进及用法详解
来源:jb51  时间:2019/10/15 10:47:57  对本文有异议

Python 3 的可迭代解包

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

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

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

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

  1. In : def a():
  2. ...: rest = (4, 5, 6)
  3. ...: t = 1, 2, 3, *rest
  4. ...: return t
  5. ...:
  6.  
  7. In : for i in a():
  8. ...: print(i)
  9. ...:

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

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

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

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

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

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

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

  1. >>> def b():
  2. ... rest = (4, 5, 6)
  3. ... return 1, 2, 3, *rest
  4. ...
  5. >>> for i in b():
  6. ... print(i)
  7. ...
  8. >>> def c():
  9. ... rest = (4, 5, 6)
  10. ... yield 1, 2, 3, *rest
  11. ...
  12. >>> for i in c():
  13. ... print(i)
  14. ...
  15. (1, 2, 3, 4, 5, 6)

你学到了么?

延伸阅读

总结

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号