149 lines
4.9 KiB
Python
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)
|