Files
python/13-17/lianxi-05namedtuple.py
T
2026-05-06 11:21:42 +08:00

149 lines
4.9 KiB
Python

# namedtuple是Python标准库collections模块中的一个工厂函数,用于创建具名元组。它允许你像访问对象的属性一样访问元组元素,主要作用是提高代码的可读性和可维护性。
# 2.1 主要特点:
# 具名访问:可以通过属性名访问元组元素
# 索引访问:仍然支持传统的索引访问方式
# 不可变性:与普通元组一样,创建后不可修改
# 内存效率:比普通类更节省内存
# 自描述性:通过字段名提供更好的代码可读性
"""
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p1 = Point(10, 20)
# 通过.的方式访问
print(p1.x) # 10
# 像普通元组一样通过索引访问元素
print(p1[0]) # 10
# 多种创建方式
from collections import namedtuple
# 方式1:使用列表定义字段
Person1 = namedtuple("Person", ["name", "age", "city"])
# 创建Person具名元组类
person1 = Person1("Alice", 25, "New York")
# 创建Person实例
print(f"方式1 - 列表定义: {person1}")
# 打印方式1的结果
# 方式2:使用字符串定义字段(空格分隔)
Person2 = namedtuple("Person", "name age city")
# 创建Person具名元组类
person2 = Person2("Bob", 30, "London")
# 创建Person实例
print(f"方式2 - 字符串定义: {person2}")
# 打印方式2的结果
# 方式3:使用字符串定义字段(逗号分隔)
Person3 = namedtuple("Person", "name, age, city")
# 创建Person具名元组类
person3 = Person3("Charlie", 35, "Tokyo")
# 创建Person实例
print(f"方式3 - 逗号分隔: {person3}")
# 打印方式3的结果
# 方式4:使用元组定义字段
Person4 = namedtuple("Person", ("name", "age", "city"))
# 创建Person具名元组类
person4 = Person4("David", 28, "Paris")
# 创建Person实例
print(f"方式4 - 元组定义: {person4}")
# 打印方式4的结果
# 打印功能验证标题
for i, person in enumerate([person1, person2, person3, person4], 1):
# 遍历所有person对象
print(f"方式{i} - 姓名: {person.name}, 年龄: {person.age}, 城市: {person.city}")
# 打印每个person的属性
"""
# namedtuple的高级功能
# 获取字段信息
# 类型转换(如转为字典)
# 字段值替换,创建并返回一个新的对象
# 从字典创建实例
# 解包
# 迭代以
# 类型检查等
# 导入namedtuple,可以创建带字段名的元组类型
from collections import namedtuple
# 定义一个Person具名元组类,包含4个字段:name, age, city, job
Person = namedtuple("Person", ["name", "age", "city", "job"])
# 功能1:获取字段信息
print("1. 字段信息:")
# 打印Person类型的所有字段名
print(f" 字段名: {Person._fields}")
# 打印字段数量(长度)
print(f" 字段数量: {len(Person._fields)}")
# 功能2:转换为字典
print("\n2. 转换为字典:")
# 创建一个Person实例,包含姓名、年龄、城市和职业
person = Person("Alice", 25, "New York", "Engineer")
# 将Person实例转换为字典
person_dict = person._asdict()
# 打印原始Person对象
print(f" 原始对象: {person}")
# 打印转换后的字典
print(f" 转换后字典: {person_dict}")
# 功能3:替换字段值
print("\n3. 替换字段值:")
print(f" 原始对象: {person}")
# 使用_replace方法,替换age和city字段,生成新的Person对象
new_person = person._replace(age=26, city="Boston")
# 打印替换字段后的新对象
print(f" 替换后对象: {new_person}")
# 功能4:从字典创建
print("\n4. 从字典创建:")
# 定义一个字典,包含Person的所有字段信息
person_data = {"name": "Bob", "age": 30, "city": "London", "job": "Designer"}
# 使用**运算符,把字典内容作为参数传递,创建Person对象
person_from_dict = Person(**person_data)
# 打印从字典创建的Person对象
print(f" 从字典创建: {person_from_dict}")
# 功能5:解包操作
print("\n5. 解包操作:")
# 对person对象进行解包,分别赋值给name, age, city, job变量
name, age, city, job = person
# 打印解包后的结果
print(f" 解包结果: name={name}, age={age}, city={city}, job={job}")
# 功能6:迭代操作
print("\n6. 迭代操作:")
print(" 迭代结果:", end=" ")
for field in person:
print(field, end=" ")
# 打印换行
print()
# 功能7:类型检查
print("\n7. 类型检查:")
# 打印person对象的实际类型
print(f" 对象类型: {type(person)}")
# 检查person是否属于内置tuple类型
print(f" 是否为元组: {isinstance(person, tuple)}")
# 检查person是否属于Person类型
print(f" 是否为Person类型: {isinstance(person, Person)}")
# join
# 生成器表达式
numbers = [1, 2, 3, 4, 5]
# 将数字转换为字符串后连接
numbers_joined = ", ".join(str(num) for num in numbers)
print("数字列表连接:", numbers_joined)
words = ["hello", "world", "python"]
# 将单词转换为大写后连接
upper_joined = " ".join(word.upper() for word in words)
print("大写单词连接:", upper_joined)