元组拆包
平行赋值
最常见的元组拆包
把一个可迭代对象里的元素,一并赋值到对应的变量组成的元组中
lax_coordinates = (33.9425, -118.408056)
latitude, longithub = lax_coordinates
print(latitude)
print(longithub)
交换变量
不使用中间变量优雅的交换两个变量的值也属于元组拆包应用
a, b = b, a
函数值的接收
一个函数用元组的形式返回多个值,例如os.path.split()
import os
_, filename = os.path.split('/home/FluentPyhon/idrsa.pub')
print(filename)
用*来处理剩下的元素
函数使用*args来获取不确定数量的参数
a, b, *rest = range(5)
print(a, b, rest)
在平行赋值中,* 前缀只能用在一个变量名前面,但这个变量可以出现在赋值表达式的任意位置
a, *body, c, d = range(5)
print(a, body, c, d)
*head, b, c, d = range(5)
print(head, b, c, d)
嵌套元组拆包
接受表达式的元组可以是嵌套式的,例如(a, b, (c, d))
# 用嵌套元组来获取经度
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.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -64.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('{:15} | {:^9.4f} | {:^9.4f}'.format(name, latitude, longitude))
具名元组
collections.namedtuple是一个工厂函数,它用于构建一个带字段名的元组和一个有名字的类
用namedtuple构造的类的实例所消耗的内存跟元组是一样的
定义和使用具名元组
具名元组记录城市信息
from collections import namedtuple
City = namedtuple('City', 'name country population coordinates')
tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
print(tokyo)
print(tokyo.population)
print(tokyo.coordinates)
print(tokyo[1])
具名元组的属性和方法
具名元组有一些自己专有的属性:
_fields类属性、类方法_make(iterable)和实例方法_asdict()
# 接上文
print(City._fields)
LatLong = namedtuple('LatLong', 'lat long')
delhi_data = ('Delhi NCR', 'IN', 21.935, LatLong(28.613889, 77.208889))
print(delhi_data)
delhi = City._make(delhi_data)
print(delhi._asdict())
for key, value in delhi._asdict().items():
print(key + ':', value)
_fileds属性是一个包含这个类所有字段名称的元组
用_make()通过接受一个可迭代的对象来生成这个类的一个实例,作用与City(*delhi_data)一样
_asdict()把具名元组以collections.OrderedDict的形式返回。