Python特性之元組


元組不單單是不可變列表

元組實際上是對數據的記錄:元組中的每一個元素都存放了記錄中一個字段的數據,外加這個字段的位置。
正是這個位置信息給數據賦予了意義
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)
相關文章
相關標籤/搜索