元组拆包可以应用到任何可迭代对象上,唯一的硬性要求是,被可迭代对象中的元素数量必须与接受这些元素的元组的空档数一致,除非我们用*来表示忽略多余的元素。
>>> a,b,c = (1,2,3)
>>> a
1
>>> b
2
>>> c
3
>>> a,b,c = [1,2,3]
>>> a
1
>>> b
2
>>> c
3
>>>
还可以用*运算符把一个可迭代对象拆开作为函数的参数:
>>> quotient,remainder = divmod(*t)
>>> quotient
3
>>> remainder
1
>>> quotient,remainder
(3, 1)
>>> a,b = [1,2]
>>> a,b
(1, 2)
元组拆包也可以让一个函数可以用元组的形式返回多个值:
>>> def test(n):
return n**2,n**3
>>> a,b = test(10)
>>> a
100
>>> b
1000
>>> a,b
(100, 1000)
我们也可以发现当函数返回多个值时是将这些值放在元组里返回的
我们也可以用占位符_来接受我们不感兴趣的返回值(最好不要再国际化软件中使用该占位符)
>>> def test(m,n):
return m//n,m%n
>>> a,_ = test(10,3)
>>> a
3
在Python3中,我们还可以用*来处理剩下的元素
>>> a,b,*rest = range(5)
>>> a,b,rest
(0, 1, [2, 3, 4])
>>> a
0
>>> b
1
>>> rest
[2, 3, 4]
>>> a,b,*rest = range(2)
>>> a,b,rest
(0, 1, [])
在平行赋值中,*前缀只能用在一个变量名前面,但这个变量可以出现在赋值表达式的任意位置,但是依然会先满足其他变量的赋值:
>>> a,*rest,c = range(2)
>>> a
0
>>> rest
[]
>>> c
1
>>> a,rest,c
(0, [], 1)
嵌套元组拆包
接受表达式的元组可以是嵌套式的,例如(a,b,(c,d)):
metro_areas = [
('张','三',('男','未婚')),
('王','二麻子',('男','未婚')),
('翠','?',('女','已婚')),
]
for firstname,lastname,(sex,ismarry) in metro_areas:
print(firstname,lastname,ismarry)
输出:张 三 未婚
王 二麻子 未婚
翠 ? 已婚
具名元组
collections.namedtuple是一个工厂函数(是生产类的而不是生产类的实例的),它可以用来构建一个带字段名的元组和一个有名字的类---带名字的类对调试程序有很大帮助(用namedtuple构建的类的实例所消耗的内存跟元组是一样的,因为字段名都被存在对于的类里面,是所有该类的实例共有的)
定义和使用具名元组
>>> from collections import namedtuple
>>> Person = namedtuple('Person','age address name')
>>> pony = Person(age=47,address='深圳',name=('马化腾','pony'))
>>> print(pony)
Person(age=47, address='深圳', name=('马化腾', 'pony'))
>>> pony.name
('马化腾', 'pony')
>>> pony.age
47
>>> pony[1]
深圳
除了从普通元组那里继承来的属性之外,具名元组还有一些自己专有的属性。
>>> Person._fields
('age', 'address', 'name')
# _fields属性是一个包含这个类所有字段名称的元组
>>> delgi_data = (52,'杭州',('马云','JackMa'))
>>> delgi = Person._make(delgi_data)
>>> delgi
Person(age=52, address='杭州', name=('马云', 'JackMa'))
# _make()接受一个可迭代对象来生成这个类的一个实例,此处的作用和Person(*delgi_data)是一样的
>>> delgi._asdict()
OrderedDict([('age', 52), ('address', '杭州'), ('name', ('马云', 'JackMa'))])
# _asdict()把具名元组以更好的形式来展现信息
>>> for key,value in delgi._asdict().items():
print(key + ':',value)
age: 52
address: 杭州
name: ('马云', 'JackMa')
>>>
以上可以看出元组是一种很强大的可以当作记录来用的数据类型,元组中的每个元素都存放了记录中一个字段的数据以及这个字段的位置(类似数据库中表的字段)