Python 中比元组更好用的 namedtuple

发布于 更新于
本文目录
  1. 一、思考
  2. 1.什么是元组?
  3. 2.元组支持哪些操作?
  4. 3.元组有什么缺点(痛点)?
  5. 三、命名元组(namedtuple)
  6. 1.定义
  7. 2.创建
  8. 3.取值
  9. 4.其他操作
  10. 5.应用场景

技术文章测试开发

不可变的序列类型

image.png

一、思考

image.png

1.什么是元组?

  • 不可变的序列类型

  • “不能修改的列表”

image.png

2.元组支持哪些操作?

  • 元组是序列类型,支持序列类型的所有操作

  • 通过索引取值

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple[-1]
  • 切片操作

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple[3:5]
  • 成员操作(in 或者 not in)

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
"可优" in one_tuple
  • 连接操作(+)

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
two_tuple = ("That is really right!", )
one_tuple + two_tuple
  • 重复操作符(*)

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
one_tuple * 2
  • 遍历(for)

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
for value in one_tuple:
    print(value)
  • 求长度(len)

one_tuple = ("可优", 17, "男", "coding", "Never Stop Learning!")
len(one_tuple)
  • 其他内置函数(all、any、max、min、list、tuple、enumerate、sorted等)

3.元组有什么缺点(痛点)?

  • 最大的痛点是只能通过数字索引来取值

  • 当元组中元素非常大时,通过索引取值非常不方便,内存消耗也大

三、命名元组(namedtuple)

1.定义

使用命名元组的步骤:

# 将元组封装为一个类,可以通过字段名(属性名)来访问元组中的值
# 支持元组的所有操作
from collections import namedtuple

# 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto")

# 2、创建对象
keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!")

# 3、获取命名元组的值
print(keyou[1])     # 支持元组的索引取值
print(keyou[-2:])   # 支持切片
print(keyou.name)   # 支持通过字段名来取值

定义命名元组类的三种方法以及rename和defaults参数:

from collections import namedtuple


# 1、定义一个类
# 方法一,传递属性名之间以空格间隔的一个字符串
Love = namedtuple("Love", "name gender age love_into hobby motto")

# 方法二,也可以以英文逗号来分隔每一个属性名
Love = namedtuple("Love", "name,gender,age,love_into,hobby,motto")

# 方法三,传递一个由属性名组成的序列类型(列表、元组)
fields = ["name", "gender", "age", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields)

# 说明:
# 属性名要符合标识符的命名规范
# 只能由数字、字母、下划线组成
# 不能以数字开头
# 不能与关键字、系统函数或类重名
# 如果属性名,不符合这些规范会报错吗?  会报错
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields)

# 如果传了一个不符合规范的属性名,又不想让它报错呢?  可以做到的
# 将rename参数设置为True,当属性名不符合规范时,会自动帮我们将不符合规范的属性名改为下划线加数字索引值
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True)

# 如果某些属性有默认值呢? 如何设置?
# 可以设置defaults参数,为一个序列类型
# 以从右到左的顺序来为属性赋默认值
fields = ["1name", "class", "def", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True, defaults=["Coding", "Never Stop Learning!"])


# 2、创建对象
# keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!")
# 由于hobby和motto这两个属性已经有默认值了,所有可以不用传这两个参数
keyou = Love("可优", "帅男", 17, "Lemon little girl")


# 3、获取命名元组的值
print(keyou[1])     # 支持元组的索引取值
print(keyou[-2:])   # 支持切片
# print(keyou.1name)   # 支持通过字段名来取值
print(keyou._0)   # 支持通过字段名来取值

2.创建

创建对象的两种方式:

# 创建对象的方式
from collections import namedtuple


# 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto")

# 2、创建对象
# 方法一,调用构造器来创建对象
keyou = Love("可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!")

# 方法二,使用_make方法来创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"]  # 任何一个序列类型都行
keyou = Love._make(one_person_value)


# 3、获取命名元组的值
print(keyou[1])     # 支持元组的索引取值
print(keyou[-2:])   # 支持切片
print(keyou.name)   # 支持通过字段名来取值

3.取值

获取命名元组中的元素的三种方式:

# 获取命名元组中的元素的方法
from collections import namedtuple


# 1、定义一个类
Love = namedtuple("Love", "name gender age love_into hobby motto")

# 2、创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"]  # 任何一个序列类型都行
keyou = Love._make(one_person_value)


# 3、获取命名元组的值
# 方法一,通过索引取值,也可以通过切片取值
print(keyou[1])     # 支持元组的索引取值
print(keyou[-2:])   # 支持切片

# 方法二,通过字段名来取值
print(keyou.name)

# 方法三,通过getattr来取值
print(getattr(keyou, 'gender'))

4.其他操作

命名元组支持的其他操作:

  • _asdict方法

  • _replace方法

  • _fields属性

  • _field_defaults属性

# 命名元组支持的其他操作

from collections import namedtuple


# 1、定义一个类
fields = ["name", "age", "gender", "love_into", "hobby", "motto"]
Love = namedtuple("Love", fields, rename=True, defaults=["Coding", "Never Stop Learning!"])

# 2、创建对象
one_person_value = ["可优", "帅男", 17, "Lemon little girl", "Coding", "Never Stop Learning!"]  # 任何一个序列类型都行
keyou = Love._make(one_person_value)


# 3、获取命名元组的值
# 方法一,通过索引取值,也可以通过切片取值
# print(keyou[1])     # 支持元组的索引取值
# print(keyou[-2:])   # 支持切片

# 方法二,通过字段名来取值
# print(keyou.name)

# 方法三,通过getattr来取值
# print(getattr(keyou, 'gender'))


# 4、其他操作
# _asdict方法,将元组转化为字典
one_dict = keyou._asdict()
print(dict(one_dict))

# _replace方法,修改元组中的值,会创建一个新元组,之前的元组未修改
print("keyou的名牌号为:{}".format(id(keyou)))
new_keyou = keyou._replace(age=16)
print("new_keyou的值为:{}\n新门牌号为:{}\n".format(new_keyou, id(new_keyou)))

# _fields,获取命名元组的所有属性名
print(keyou._fields)

# _field_defaults,获取命名元组的所有属性默认值
print(keyou._fields_defaults)

5.应用场景

  • 将测试数据从Excel(csv、json、数据库)中读取出来,在Python中处理时,往往可以使用namedtuple来承载数据

  • 需要使用元组来处理数据的所有场景都可以

来源:testingpai

继续阅读