迭代解包,在Python的官方文档里面提的是:
Extended Iterable Unpacking
(https://www.python.org/dev/peps/pep-3132/)
有些情况下,有做元组解包,元组拆包之类的,都是一些翻译因素。其实都是一类意思,迭代解包比元组解包覆盖的更全一些。
当然为什么叫元组** ,这个就没有发现为什么了,但是这个并不影响我们的使用和理解,只是一个题外话。
元组解包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致。
也可以使用用 * 来表示忽略多余的元素。
这种方式的优点在于:更好的赋值,更好的获取迭代对象中的某个值
一般的迭代对象分为:元组,列表,字典,字符串等。如果有一些不能明确的对象,可以通过以下方式进行判断,是否为可迭代。
判断对象是否可迭代:
>>> from collections import Iterable
>>> isinstance('abc', Iterable)
True
>>>
最好辨认的元组解包的形式就是平行赋值
>>> num = (3, 4)
>>> x, y = num
>>> x
3
>>> y
4
>>>
被迭代元素数量和接受元素的参数数量一致,如果不一致就会抛出异常:
>>> x, y, z = num
Traceback (most recent call last):
File "<pyshell#25>", line 1, in <module>
x, y, z = num
ValueError: not enough values to unpack (expected 3, got 2)
>>>
可以使用*来忽略多余的元素(Python3对于*的扩展)
>>> data, *rest = range(5)
>>> data
0
>>> rest
[1, 2, 3, 4]
>>>
在进行解包的时候,我们并不总是对元组里所有的数据都感兴趣, _ 占位符能帮助处理这种情况:
>>> import os
>>> _, filename = os.path.split('/home/test/path/filename.pdf')
>>> filename
'filename.pdf'
如果做的是国际化软件,那么 _ 可能就不是一个理想的占位符,因为它也是gettext.gettext 函数(翻译函数)的常用别名。在其他情况下, _ 会是一个很好的占位符
嵌套元组解包:
-------
>>> data = ['ABC', 40, 2.2, (2017, 12, 21)]
>>> name, age, grade, date = data
>>> name
'ABC'
>>> date
(2017, 12, 21)