Python元组拆包和具名元组解析实例详解

  • Post category:Python

Python元组拆包和具名元组解析实例详解

什么是元组拆包和具名元组

Python中的元组(tuple)是不可变的有序序列,在实际开发中,我们有时需要同时获得多个变量的值,可以通过元组拆包的方式来实现。例如:

a, b = 1, 2

这个语句将数字1、2分别赋给a、b两个变量。

具名元组(namedtuple)是Python标准库collections模块中的一个工具类,它让我们可以为元组的每个位置指定一个名称,从而可以通过名称来访问元组中的值。例如:

from collections import namedtuple

Person = namedtuple('Person', ['name', 'age', 'gender'])

p = Person('Tom', 18, 'male')
print(p.name, p.age, p.gender)

这个语句定义了一个名为Person的具名元组,它有三个元素name、age、gender。用p = Person(‘Tom’, 18, ‘male’)命令创建了一个Person类型的对象p,并将其赋值为(‘Tom’, 18, ‘male’)。可以通过p.name、p.age、p.gender来访问对象p中的元素。

元组拆包示例

例1:交换两个变量的值

a, b = 1, 2
a, b = b, a
print(a, b)  # 输出2 1

这个示例中,我们首先将1、2赋值给a、b两个变量,然后通过a、b = b、a这一句话来交换它们的值,最后输出a、b的值。

例2:返回多个值

有时候函数需要返回多个值,可以使用元组拆包来实现。例如:

def get_name_and_age():
    name, age = 'Tom', 18
    return name, age

name, age = get_name_and_age()
print(name, age)

这个示例中,我们定义了一个函数get_name_and_age,它返回名为name、age的两个变量。在函数外部可以通过元组拆包的方式来获得返回值中的变量。

具名元组示例

例1:统计班级成绩

from collections import namedtuple

Student = namedtuple('Student', ['name', 'grade'])

students = [
    Student('Tom', 90),
    Student('Jerry', 80),
    Student('Mike', 95),
    Student('Amy', 85),
    Student('Jack', 92)
]

total_grade = 0
for student in students:
    total_grade += student.grade

mean_grade = total_grade / len(students)
print(mean_grade)

这个示例中,我们定义了一个名为Student的具名元组,它有两个元素name、grade。通过定义students这个列表,每个元素都是Student类型的元组。我们通过遍历students列表来统计班级总分,计算班级平均分,并输出平均分数。(这里未做浮点数保留)

例2:固定关键字参数

在函数中,有时候需要固定一些关键字参数的名称和值,可以使用具名元组来实现。例如:

from collections import namedtuple

Point = namedtuple('Point', ['x', 'y'])

def move_to(p, delta_x, delta_y):
    return Point(p.x+delta_x, p.y+delta_y)

p = Point(1, 1)
p = move_to(p, 2, 3)
print(p)  # 输出Point(x=3, y=4)

这个示例中,我们首先定义了一个名为Point的具名元组,它有两个元素x、y。我们定义一个move_to函数来移动一个点,其中我们希望固定delta_x、delta_y两个关键字参数的名称和值,并使用具名元组p来存储点的坐标。在move_to函数中,我们通过p.x、p.y来获得点的原始位置,然后使用delta_x、delta_y偏移坐标,最后将结果存储在一个新的具名元组中并返回。