# 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)