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的形式返回,即以键值对列表的形式返回。
posted @   肖肖凯  阅读(88)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示