元组不仅仅是不可变列表
元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。
正是这个位置信息给数据赋予了意义
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)
元组拆包可以应用到任何可迭代对象
唯一硬性要求:被迭代对象中的元素数量必须要跟接受这些元素的元组的空档数一致
最好辨认的元组拆包形式就是平行赋值
latitude, longitude = lax_coordinates
latitude, longitude = longitude, latitude
t = (20, 8)
quotient, remainder = divmod(*t)
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)