元组不仅仅是不可变列表

元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。
正是这个位置信息给数据赋予了意义
lax_coordinates = (33.9425, -118.408056)
city, year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
for passport in sorted(traveler_ids):
    print('%s/%s' % passport)

for country, _ in traveler_ids:  # 元组拆包
    print(country)

元组拆包可以应用到任何可迭代对象

唯一硬性要求:被迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致
最好辨认的元组拆包形式就是平行赋值
  • 1 平行赋值
latitude, longitude = lax_coordinates
  • 2 不使用中间变量
latitude, longitude = longitude, latitude
  • 3 用*运算符把一个可迭代对象拆开作为函数的参数
t = (20, 8)
quotient, remainder = divmod(*t)
  • 4 让一个函数可以以元组的形式返回多个值
import os
_, filename = os.path.split('/home/app/.ssh/idrsa.pub')
print(filename)
  • 用*来处理剩下的元素
a, b, *rest = range(5)
print(*rest)
  • *前缀只能用在一个变量名前面,但是位置可以随意
a, *body, c, d = range(5)
print(*body)

嵌套元组拆包

metro_areas = [
    ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),
    ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
    ('Mexico, City', 'MX', 20.142, (19.43333, -99.133333)),
    ('New York-Newark', 'US', 20.142, (40.808611, -74.020386)),
    ('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]

print('{:15} |{:^9} |{:^9}'.format('', 'lat.', 'long.'))
fmt = '{:15} | {:9.4f}|{:9.4f}'
for name, cc, pop, (latitude, longitude) in metro_areas:
    if longitude <= 0:
        print(fmt.format(name, latitude, longitude))

具名元组

  • collections.namedtuple 是一个工厂函数,可以用来构建一个带字段名字的元组和一个有名字的类(利于调试)
  • 创建一个具名元组需要两个参数,一个是类名,另一个是类的各个字段的名字。
  • 存放在对应字段的数据要以一串参数的形式传入到构造函数中。
  • 通过字段名或者位置来获取一个字段的信息
from collections import namedtuple
City = namedtuple('City', 'name country population coordinates')
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
print(tokyo)
  • _fields属性是一个包含这个类所有字段名称的元组
  • 用_make()通过接受一个可迭代对象来生成这个类的一个实例,作用跟City(*delhi_data)一样
  • _asdict把具名元组以collections.OrderedDict形式返回
print(City._fields)
LatLong = namedtuple('LatLong', 'lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.208889))
delhi = City._make(delhi_data)
print(delhi._asdict())
for key, value in delhi._asdict().items():
    print(key + ':', value)

EngineerLeo
598 声望38 粉丝

专注于云原生、AI等相关技术