python元组的两种用法

一、用作记录

元组可以用作没有字段名称的记录:元组中的每一项都对应一个字段的数据,项的位置决定了数据的意义。因此将元组作为字段的容器使用时,项数通常是固定的,那么顺序就变得十分重要了。

# 记录洛杉矶国际机场的经纬度
lax_coordinates = (33.9425, -118.408046)
# 记录东京市的一些信息:城市、年份、人口、人口变化、面积
city, year, pop, chg, area = ('Tokyo', 2003, 32_450, 0.66, 8014)
# 记录城市名、护照编号的一个元组列表
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'),
                ('ESP', 'XDA205856')]
for passport in traveler_ids:
    print("%s/%s" % passport)
    # output:
    # USA/31195855
    # BRA/CE342567
    # ESP/XDA205856

for country, _ in traveler_ids:
    print(country)
    # output:
    # USA
    # BRA
    # ESP

其中:

1、%格式化运算符理解元组结构,会将每一项都当做不同的字段;

2、for循环知道如何获取元组中单独的每一项,我们将不感兴趣的项赋值给虚拟变量_,虚拟变量匹配值但不绑定值;

3、记录东京市信息以及print函数中使用的%中,都将元组中各项的值赋值给对应是变量/占位符,这两处都使用到了元组拆包

二、不可变列表

将tuple类当做list类的一个变体,这样做有两个好处:

1、意图清晰:在源码中见到元组就知道它的长度永不可变

2、性能优越:长度相同的元组和列表,元组占用的内存更少

注意:元组的不可变性仅针对元组中的引用(元组的内容自身)而言,即元组中的引用不可删除、不可替换,这仅仅表明元组中存放的引用始终指向同一批对象,如果元组中引用的为可变对象,那改变对象后,元组也会随之改变,示例如下:

a = (10, 'alpha', [1, 2])
b = (10, 'alpha', [1, 2])
print(a == b)
# output: True
b[-1].append(3)
print(b)
# output: (10, 'alpha', [1, 2, 3])
print(a == b)
# output: False

 补充:不可哈希的元组不能作为字典的键,也不能作为集合的元素,只有值永不可变的对象才是可哈希的。

如果想要显示的判断一个元组/对象的值是否固定,可以使用内置函数hash()去定义:

def fixed(obj):
    try:
        hash(obj)
    except TypeError:
        return False
    return True

a = (10, 'alpha', (1, 2))
b = (10, 'alpha', [1, 2])
print(fixed(a))
# output: True
print(fixed(b))
# output: False

三、列表和元组的比较

1、相比列表元组在性能上的优势:

a、python编译器在求解元组字面量时,经过一次操作即可生成元组常量的字节码;求解列表字面量时,生成的字节码将每个元素当作独立的常量推入数据栈,然后构建列表

b、给定一个元组t,tuple(t)直接返回t的引用,不涉及复制;给定列表l,list(l)创建l的副本

c、tuple实例长度固定,分配的内存空间正好够用;list实例的内存空间要富余一些,时刻准备追加元素

d、元组中项的引用存储在元组结构体内的一个数组中,而列表把引用数组的指针存储在别处,因为列表可以变长,一旦超出当前分配的空间,python就需要重新分配引用数组来腾空间,这也会导致CPU缓存效率较低

2、列表和元组方法的比较:

元组支持所有不涉及增删项的列表方法,而且元组没有__reversed__方法,但reversed(my_tuple)是能正常使用的

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值