普通元组
- 元组不仅仅是不可变的列表
- 元组其实是对数据的记录:元组中的每个元素都存放了记录中一个字段的数据,外加这个字段的位置。正是这个位置信息给数据赋予了意义。
- 把元组用作记录
- 元组拆包:元组拆包可以应用到任何可迭代对象上,
- # 唯一硬性要求:被可迭代对象中的元素数量必须要跟接收这些元素的元组的空档数一致。
# 一句话交换两个变量的值:
a,b = b,a
# 还可以用* 运算符把一个可迭代对象拆开作为函数的参数
# print(divmod(20,8))
# Return the tuple (x//y, x%y) (2,4)
t = (20,8)
divmod(*t) # 拆开
a,b,*rest,d = range(5) # *rest 接收剩余的值 可以出现在赋值表达式的任意位置
print(rest)
接受表达式的元组可以是嵌套式的,例如(a,b,(c,d))。
只要这个接受元组的嵌套结构符合表达式本身的嵌套结构,Python就可以做出正确的对应
metro_areas = { ('Tony','JP',34.2,(11,12)), ('Tom','UI',3.8,(13,14)), ('Jenny','JP',3.0,(15,16)), ('Jeyffer','JP',34.2,(17,18)) } print('{:10} | {:^9} | {:^9}'.format('','lat.','long.')) # format对齐的方式 fmt = '{:10} | {:9.4f} | {:9.4f}' for name,cc,pop,(latitude,longitude) in metro_areas: print(fmt.format(name,latitude,longitude)) 用嵌套元组来获取经纬度
具名元组
collections.namedtuple是一个工厂函数,可以用来构建一个带字段名的元组和一个有名字的类。
用namedtuple构建的类的实例所消耗的内存和元组是一样的,因为字段名都被存在对应的类里面。这个实例跟普通的对象实例比起来小一些,因为Python不会用__dict__来存放这些实例的属性。
# 定义和使用具名元组 from collections import namedtuple City = namedtuple('City','name country population coordinates') tokyo = City('Tokyo','JP',36.933,(35.678,89.3455)) print(tokyo) # City(name='Tokyo', country='JP', population=36.933, coordinates=(35.678, 89.3455))
注意:
1、创建一个具名元组需要两个参数,一个是类名,另一个是类的各个字段的名字。后者可以是由数个字符串组成的可迭代对象,或者是由空格分隔开的字段名组成的字符串。
2、存放在对应字段里的数据要以一串参数的形式传入到构造函数中。(注意,元组的构造函数却只接受单一的可迭代对象)。
3、可以通过字段名或者位置来获取一个字段的信息。
# _fields类属性:包含这个类所有字段名称的元组。 print(City._fields) # ('name', 'country', 'population', 'coordinates') # 用_make() 通过接受一个可迭代对象来生成这个类的一个实例,作用与City(*delhi_data)一样 LatLong = namedtuple('LatLong','lat long') delhi_data = ('Delhi NCR','IN',21.935,LatLong(28.613889,77.2088)) delhi = City._make(delhi_data); # print(delhi) # _asdict()把具名元组以collections.OrderDict(有序的字典结构)的形式返回 print(delhi._asdict()) 专有属性