python元组
元组作为不可变列表
-
一般情况下,我们都认为元组就是不可改变的列表,除了与增删相关的方法外,元组几乎支持列表的其它所有方法。
-
此外有一个例外,元组并没有特殊方法__reversed__,但是仍然可以用reversed(my_tuple)来获取一个逆序元组,此时并没有改变元组my_tuple,而是返回一个与其逆序的新的元组。
如下例子,逆序之后a的地址并没有改变,而是返回了一个新的对象。a = (1, 2, 3, 4, 5) print(id(a)) b = reversed(a) print(id(a), id(b))
输出为:
140640685733232 140640685733232 140640685336616
元组作为记录
元组除了可以看作不可变列表,还经常作为记录使用,一般记录都需要有对应的字段和值,而元组是没有字段的,元组的每个位置的值的现实汉含义需要人工赋予。
如下例子,列表traveler_ids中有三个元组,可以看成是三条记录,其中每条记录的第一个元素代表国家,第二个元素代表护照号码。
traveler_ids = [('USA', '31195855'), ('BRA', 'CE342567'), ('ESP', 'XDA205856')]
元组拆包
元素拆包两种方式
city , year, pop, chg, area = ('Tokyo', 2003, 32450, 0.66, 8014)
'%s/%s' % passport
- 第一种是用相等数量的变量来接收元组中的每个元素
- 第二种是用相等数量的格式控制符来接收元组中的元素
可迭代对象拆包
虽然经常说元组拆包,但实际上,可迭代对象均可拆包。但是一般使用第一种方式来进行可迭代对象拆包。
拆包应用1--不借助中间变量交换值
本质上这也是元组拆包,但是因为赋值符号有点只有一个元组,因此把小括号省略了。
b, a = a, b
拆包应用2--将元组作为函数返回值
如果我们要返回n个元素,可以将它们组成一个元组再返回,这样方便在程序中用几个变量来接收返回值,对于不敢兴趣的返回值,我们可以用 "_"来作占位符。
如下例子,我们对具体的路径不感兴趣,只想获取文件名。
import os
_, filename = os.path.split('/home/chk/.ssh/idrsa.pub')
拆包应用3--用*号将可迭代对象拆包给函数传参
如下例子,其中divmod()函数接收两个参数,分别代表被除数和除数,返回一个双元素元组,代表商和余数。
t = (20, 8)
a, b = divmod(*t)
拆包应用4--用*args来接收不确定数量的返回值
- 如下例子,在用多个变量接收值时,只有一个变量能用*号修饰,接收不确定数量的返回值。
- *标识的变量可以放在任意位置。
具名元组
python标准库collections中的namedtuple,即具名元组。
from collections import namedtuple
import sys
Card = namedtuple("Card", "x y z")
t1 = Card(1, 2, 3)
t2 = (1, 2, 3)
print(sys.getsizeof(t1), sys.getsizeof(t2))
具名元组创建
namedtuple相当于一个模板类,要实例化出一个具名元组类,需要两个参数。
- 第一个是类名,即上文中的"Card"。
- 第二个是各个字段名,可以是由多个字符串组成的可迭代对象,或者空格分隔开的字段名组成的字符串。
具名元组获取某个字段的值
两种方式。
- 一种是通过字典名
- 一种是通过位置索引
具名元组占用内存
用namedtuple创建的具名元组对象占用的内存大小与python标准元组是一样的。
具名元组专有属性
- _fields类属性,是一个包含这个类所有字段名的元组。所以我怀疑之所以具名元组与普通元组占用内存一样,就是因为字段名被组成元组设置成了类属性,每次用字段名取值的时候都去与类属性_field元组中的元素对比,然后确定该字段名对应的索引,本质上还是通过索引来取值。
- _make(iterable)类方法,可以接收一个可迭代对象来生成一个实例,如果不同_make()方法,就只能传入很多个参数来构造,而不能直接传入一个可迭代对象。另一种方法是用*前缀来拆包可迭代对象然后传参。
- _asdict()实例方法,用于将具名元组对象以collections.OrderedDict的形式返回,即以键值对列表的形式返回。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)