Python 使用元组和命名元组

  • Post category:Python

当我们需要将多个值作为一个整体进行传递或处理时,可以使用 Python 中的元组。元组相当于一个不可变的列表,可以存储任意类型的元素(包括内部嵌套元组),而且元素的值一旦被确定就不能再修改。在进行函数返回值或函数参数传递时常常使用元组。

下面是 Python 使用元组和命名元组的完整攻略:

使用元组

定义元组

元组与列表类似,但用圆括号 () 定义,而不是方括号 []。

tup = (1, 2, 3)

访问元组中的元素

元组使用索引值访问单个元素,最后一个元素的索引值是 -1。

print(tup[0])  # 输出 1
print(tup[-1])  # 输出 3

修改元组

因为元组是不可变类型,在定义之后元素的值就不能更改。如果必须更改元组,需要先将元组转换为列表进行修改,然后再将修改后的列表转换回元组。

tup = (1, 2, 3)
lst = list(tup)
lst[0] = 4
tup = tuple(lst)
print(tup)  # 输出 (4, 2, 3)

合并元组

使用 + 运算符将两个元组合并为一个新的元组。

tup1 = (1, 2, 3)
tup2 = (4, 5, 6)
tup3 = tup1 + tup2
print(tup3)  # 输出 (1, 2, 3, 4, 5, 6)

查询元组中的元素个数

使用 len 函数查询元组中元素的个数。

tup = (1, 2, 3)
num_elements = len(tup)
print(num_elements)  # 输出 3

使用命名元组

命名元组是基于元组的子类,为元组中的每个位置指定了一个名称。它的优点是可读性和自说明性更强,因为元组中的每个位置都有了一个名称,可以避免硬编码索引值,从而减少错误。

定义命名元组

使用 collections 模块中的 namedtuple 函数定义一个命名元组。其中需要给出元组的名称和每个位置的名称。

from collections import namedtuple

# 定义一个命名元组
Student = namedtuple('Student', ['name', 'age', 'gender'])

创建命名元组对象

使用定义好的命名元组名称和每个位置的值来创建一个命名元组对象。

# 创建一个命名元组对象
student1 = Student('Tom', 20, 'male')

# 访问命名元组的属性
print(student1.name)  # 输出 Tom
print(student1.age)  # 输出 20
print(student1.gender)  # 输出 male

将命名元组转换为字典

使用 _asdict 方法将命名元组转换为字典。

# 将命名元组转换为字典
student_dict = student1._asdict()
print(student_dict)  # 输出 {'name': 'Tom', 'age': 20, 'gender': 'male'}

创建新的命名元组

使用 _replace 方法创建一个新的命名元组对象。

# 创建一个新的命名元组对象
student2 = student1._replace(name='Jerry')
print(student2)  # 输出 Student(name='Jerry', age=20, gender='male')

上面是 Python 使用元组和命名元组的完整攻略。下面给出两个使用元组和命名元组的示例:

示例 1:使用元组表示二维平面上的点

point = (1, 2)

# 访问元组中的元素
x, y = point
print('x:', x, 'y:', y)

# 将元组转换为列表修改
lst = list(point)
lst[0] = 3
point = tuple(lst)
print('point:', point)

输出结果:

x: 1 y: 2
point: (3, 2)

示例 2:使用命名元组表示学生信息

from collections import namedtuple

# 定义一个命名元组
Student = namedtuple('Student', ['name', 'age', 'gender'])

# 创建一个命名元组对象
student1 = Student('Tom', 20, 'male')

# 输出学生信息
print('name:', student1.name)
print('age:', student1.age)
print('gender:', student1.gender)

输出结果:

name: Tom
age: 20
gender: male