元组拆包可以应用到任何可迭代的对象上,但是要求可迭代对象中的元素数量必须要跟接收这些元素的元组的空档一致,以下是元组拆包可能出现的情况。
1、最简单的拆包形式就是平行复制,也就是说把一个可迭代对象里的元素一并赋值到由对应的变量组成的元组当中。
>>> t1 = (1,2,3)
>>> a,b,c = t1
>>> print(a,b,c)
1 2 3
2、用 ’ * ‘ 运算符把一个可迭代对象拆开作为参数。
>>> divmod(20,6)
(3, 2)
>>> t = (20,6)
>>> divmod(*t)
(3, 2)
>>> a,b = divmod(*t)
>>> print(a,b)
3 2
3、用 ‘ * ’ 作为前缀来处理部分元素,只能用在一个变量名的前面,但是这个变量可以出现在赋值表达式的任意位置。
>>> t = (1,2,3,4,5,6)
>>> a,b,*c = t
>>> print(a,b,c)
1 2 [3, 4, 5, 6]
>>> t1 = (1,)
>>> a,*b = t1
>>> a,b
(1, [])
>>> a,*b,c = t
>>> a,b,c
(1, [2, 3, 4, 5], 6)
>>> *_,a,b = t
>>> print(_,a,b)
[1, 2, 3, 4] 5 6
在简单的 t = (1,2,3,4,5,6),a,b,*c = t,赋值操作中,底层代码中,其实实现了拆包和装包两个过程,赋值即为装包的过程,打印为拆包的过程:
4、嵌套元组拆包
接收表达式的元组也可以是嵌套结构的,只要接收元组的嵌套结构符合表达式本身的嵌套结构,编译器就可以做出正确的对应。下面是一个嵌套元组拆包的例子。
>>> info = [('张三',18,'中国',(90,80,70)),
('李四',16,'中国',(67,57,87)),
('王五',19,'中国',(96,97,98))]
>>> for name,age,country,(math,language,english) in info:
print(name,age,country,math)
张三 18 中国 90
李四 16 中国 67
王五 19 中国 96
>>> sorce = (math,language,english)
>>> for name,age,country,sorce in info:
print(name,age,country,sorce)
张三 18 中国 (90, 80, 70)
李四 16 中国 (67, 57, 87)
王五 19 中国 (96, 97, 98)