上一篇文章中,我们介绍了元组作为不可变列表的用法,但一个同样重要的用法是把元组用作信息的记录
>>> city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
可以看到,上面的例子中只用一行代码,就让元组中的每个元素都被赋值给不同的变量,这个过程就被称为元组拆包
通过元组拆包实现变量交换
下面就是一个通过元组拆包实现的十分优雅的变量交换操作:
>>> b, a = a, b
除了给变量赋值,只要可迭代对象的元素数与元组中元素数量一致,任何可迭代对象都可以用元组拆包来赋值
可迭代对象的拆包
可以用 * 运算符将任何一个可迭代对象拆包作为方法的参数:
>>> divmod(20, 8)
(2, 4)
>>> t = (20, 8)
>>> divmod(*t)
(2, 4)
不确定拆分结果的获取
Python 允许被拆包赋值的一系列变量中最多存在一个以 * 开始的变量,他用来接收所有拆包赋值后剩下的变量
*args 用来获取不确定参数是最经典的写法了
>>> a, b, *rest = range(5)
>>> a, b, rest
(0, 1, [2, 3, 4])
元组拆包的嵌套
元组拆包是可以嵌套的,只要接受元组嵌套结构符合表达式本身的嵌套结构,Python 就可以做出正确的处理
具名元组 -- collections.namedtuple
具名元组就是带有名字和字段名的元组,他用元组模拟了一个简易的类
我们通过 collections.namedtuple 方法就可以构建一个具名元组:
>>> from collections import namedtuple
>>> City = namedtuple('City', 'name country population coordinates')
>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo
City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722, 139.691667))
本质上,具名元组仍然是元组用于记录元素的一种用法
具名元组的属性和方法
除了所有元组具有的属性和方法,具名元组还具有下面三个有用的属性和方法【_fields】 -- 类属性,包含具名元组所有字段名称的元组
【_make()】 -- 通过接受一个可迭代对象生成类实例,如 City._make(*delphi_data)
【_asdict()】 -- 把具名元组以 collections.OrderedDict 类型返回,可以用于友好的展示