首页 > 编程语言 >Python数据结构:元组详解(创建、访问、不可变特性)②

Python数据结构:元组详解(创建、访问、不可变特性)②

时间:2024-08-20 08:57:10浏览次数:12  
标签:Python self 学生 students student print 数据结构 元组

在这里插入图片描述@[toc]

Python中的元组(Tuple)是一种重要的数据结构,与列表类似,但元组是不可变的,这意味着一旦创建,就无法修改。元组的不可变性使其在某些场景下比列表更具优势。本文将详细介绍Python元组的创建、访问、不可变特性,并附上一个综合复杂的例子,全面展示元组在实际编程中的应用。

一、创建元组

元组的创建非常简单,使用圆括号 () 将多个元素包裹起来。元组可以包含任意类型的元素,包括数字、字符串、布尔值、甚至其他元组。

1.1 创建空元组

创建一个空元组的方法如下:

empty_tuple = ()

1.2 创建包含元素的元组

创建一个包含元素的元组,可以直接在圆括号中添加元素,元素之间用逗号分隔。

numbers = (1, 2, 3, 4, 5)
strings = ("apple", "banana", "cherry")
mixed = (1, "apple", True, 3.14)

1.3 创建单元素元组

创建一个包含单个元素的元组,需要在元素后添加一个逗号,否则会被识别为普通的括号运算。

single_element_tuple = (42,)

1.4 使用内置函数创建元组

可以使用内置函数 tuple() 将其他可迭代对象(如列表、字符串)转换为元组。

list_to_tuple = tuple([1, 2, 3])
string_to_tuple = tuple("hello")
print(list_to_tuple)  # 输出 (1, 2, 3)
print(string_to_tuple)  # 输出 ('h', 'e', 'l', 'l', 'o')

二、访问元组元素

与列表类似,元组中的元素是有序的,每个元素都有一个唯一的索引。可以通过索引来访问元组中的元素,索引从0开始。也可以使用负索引从元组的末尾开始访问元素。

2.1 通过正索引访问元素

fruits = ("apple", "banana", "cherry")
print(fruits[0])  # 输出 "apple"
print(fruits[1])  # 输出 "banana"
print(fruits[2])  # 输出 "cherry"

2.2 通过负索引访问元素

fruits = ("apple", "banana", "cherry")
print(fruits[-1])  # 输出 "cherry"
print(fruits[-2])  # 输出 "banana"
print(fruits[-3])  # 输出 "apple"

2.3 元组切片

可以使用切片操作符 : 来访问元组中的一部分元素。切片操作符 start:stop 会返回从索引 startstop-1 的元素。切片操作符 start:stop:step 可以指定步长 step

fruits = ("apple", "banana", "cherry", "date", "fig", "grape")
print(fruits[1:4])  # 输出 ('banana', 'cherry', 'date')
print(fruits[:3])   # 输出 ('apple', 'banana', 'cherry')
print(fruits[3:])   # 输出 ('date', 'fig', 'grape')
print(fruits[::2])  # 输出 ('apple', 'cherry', 'fig')
print(fruits[::-1]) # 输出 ('grape', 'fig', 'date', 'cherry', 'banana', 'apple')

三、元组的不可变特性

元组与列表的一个主要区别在于元组是不可变的。这意味着一旦元组创建后,其内容不能被修改。这种不可变性使得元组在某些场景下更为适用,比如需要保证数据的完整性或作为字典的键。

3.1 不可变性示例

尝试修改元组的元素会引发 TypeError

numbers = (1, 2, 3)
# numbers[1] = 4  # TypeError: 'tuple' object does not support item assignment

3.2 替代方法

虽然元组是不可变的,但可以通过重新创建一个新的元组来间接实现修改。

numbers = (1, 2, 3)
new_numbers = numbers[:1] + (4,) + numbers[2:]
print(new_numbers)  # 输出 (1, 4, 3)

四、元组的方法

由于元组是不可变的,因此其方法相对较少。常用的方法包括 count()index()

4.1 count()

count() 方法用于计算元组中某个元素的出现次数。

numbers = (1, 2, 3, 2, 2)
count_of_two = numbers.count(2)
print(count_of_two)  # 输出 3

4.2 index()

index() 方法用于返回元组中第一个匹配值的索引。

numbers = (1, 2, 3, 2)
index_of_two = numbers.index(2)
print(index_of_two)  # 输出 1

五、综合复杂示例

为了更好地理解Python元组的创建、访问、不可变特性及其方法的应用,下面提供一个综合复杂的例子,模拟一个简单的学生信息管理系统。该系统包括添加学生信息、查询学生信息、统计学生数量等功能。

class Student:
    def __init__(self, name, age, grades):
        """
        初始化学生实例

        参数:
        name (str): 学生姓名
        age (int): 学生年龄
        grades (tuple): 学生成绩
        """
        self.name = name
        self.age = age
        self.grades = grades

    def average_grade(self):
        """
        计算平均成绩

        返回:
        float: 平均成绩
        """
        if not self.grades:
            return 0
        return sum(self.grades) / len(self.grades)


class School:
    def __init__(self):
        """
        初始化学校实例
        """
        self.students = []

    def add_student(self, name, age, grades):
        """
        添加学生信息

        参数:
        name (str): 学生姓名
        age (int): 学生年龄
        grades (tuple): 学生成绩
        """
        student = Student(name, age, grades)
        self.students.append(student)

    def find_student(self, name):
        """
        查找学生信息

        参数:
        name (str): 学生姓名

        返回:
        Student: 学生实例
        """
        for student in self.students:
            if student.name == name:
                return student
        return None

    def print_students(self):
        """
        打印所有学生信息
        """
        for student in self.students:
            print(f"姓名: {student.name}, 年龄: {student.age}, 成绩: {student.grades}")

    def print_averages(self):
        """
        打印所有学生的平均成绩
        """
        for student in self.students:
            print(f"{student.name}: {student.average_grade()}")

    def count_students(self):
        """
        统计学生数量

        返回:
        int: 学生数量
        """
        return len(self.students)

    def sort_students_by_average(self):
        """
        按照平均成绩排序学生
        """
        self.students.sort(key=lambda s: s.average_grade(), reverse=True)


# 创建学校实例
school = School()

# 添加学生信息
school.add_student("Alice", 20, (85, 90, 92))
school.add_student("Bob", 21, (78, 82, 88))
school.add_student("Charlie", 22, (95, 88, 91))

# 打印所有学生信息
print("所有学生信息:")
school.print_students()

# 打印所有学生的平均成绩
print("\n所有学生的平均成绩:")
school.print_averages()

# 统计学生数量
print("\n学生总数:")
print(school.count_students())

# 按平均成绩排序学生并打印
school.sort_students_by_average()
print("\n按平均成绩排序的学生列表:")
school.print_averages()

5.1 代码说明

  1. Student类:

    • __init__: 初始化学生实例,包含姓名、年龄和成绩(元组)。
    • average_grade: 计算并返回平均成绩。
  2. School类:

    • __init__: 初始化学校实例,包含学生列表。
    • add_student: 添加学生信息到学生列表。
    • find_student: 根据姓名查找学生信息。
    • print_students: 打印所有学生信息。
    • print_averages: 打印所有学生的平均成绩。
    • count_students: 统计学生数量。
    • sort_students_by_average: 按平均成绩降序排序学生。

5.2 输出结果

在这里插入图片描述

5.3 代码说明

  1. Student类:

    • __init__: 初始化学生实例,包含姓名、年龄和成绩(元组)。
    • average_grade: 计算并返回平均成绩。
  2. School类:

    • __init__: 初始化学校实例,包含学生列表。
    • add_student: 添加学生信息到学生列表。
    • find_student: 根据姓名查找学生信息。
    • print_students: 打印所有学生信息。
    • print_averages: 打印所有学生的平均成绩。
    • count_students: 统计学生数量。
    • sort_students_by_average: 按平均成绩降序排序学生。

通过这个综合复杂的示例,我们可以看到Python元组在实际编程中的应用。元组的不可变特性保证了数据的完整性,使其在需要不可变数据结构的场景下非常有用。掌握元组的创建、访问、不可变特性及其方法,是学习Python编程的重要一环。希望本文对您理解和应用Python元组有所帮助。

欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力

在这里插入图片描述

标签:Python,self,学生,students,student,print,数据结构,元组
From: https://blog.csdn.net/rjdeng/article/details/141340869

相关文章

  • 利用python下载小鹅通课程视频的方法(已购) 绝对有效2024
    1、先找到视频对应的红框里的地址,网页右键,审查元素。2、打开地址,下载视频对应文件,使用记事本打开,查看文件内容。3、使用Python解析文件里的url,进行视频下载。importrequestsimportrefromCrypto.CipherimportAESdefm3u8(url):header={'User-Agen......
  • 实战教程:Python实现高校爬虫,运用协同过滤与k-means算法进行专业评分分析
    ......
  • unbuntu更新Python3版本到最新,安装依赖手动编译
    安装依赖sudoaptupdatesudoaptinstallbuild-essentialzlib1g-devlibffi-devlibssl-dev下载安装包,手动配置编译官网查找对应linux版本tgz包wgethttps://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgztar-xzvfPython-3.11.0.tgzcdPython-3.11.0......
  • 3142:练23.4 首字母(C、C++、python)
    3142:练23.4 首字母信息学奥赛一本通-编程启蒙(C++版)在线评测系统C源码:#include<stdio.h>#include<stdlib.h>intmain(){ charb; scanf("%c",&b); if(b=='a'){ printf("apple"); } elseif(b=='b'){ printf("ba......
  • 【数据结构与算法第一章】编程基础:变量与数据类型、指针、结构体、数组与链表、程序结
    目录【数据结构与算法第一章】编程基础1.1变量与数据类型1.2指针1.3结构体1.4数组和链表1.5程序结构1.6函数中参数的传递1.7C语言中运算符的含义【数据结构与算法第一章】编程基础1.1变量与数据类型变量:    ①在C语言中,所有变量必须先声明后使用......
  • 数据炼金术:用Python爬虫精炼信息
    标题:数据炼金术:用Python爬虫精炼信息在数据泛滥的互联网时代,Python爬虫不仅是搜集信息的利器,更是清洗和格式化数据的炼金术。本文将带你走进数据清洗和格式化的世界,展示如何使用Python爬虫从海量网络信息中提取、清洗并重塑数据,最终转化为有价值的信息资产。一、数据清洗......
  • Java常见数据结构
    Java常见的数据结构:1.栈2.队列3.数组4.链表5.二叉树6.二叉查找树7.平衡二叉树8.红黑树9.哈希表1.栈特点:“先进后出,后进先出”基本操作:push(入栈):将元素推入栈中。pop(出栈):从栈中移除并返回顶部的元素。peek(或top):查看栈顶的元素,......
  • 变频器的python用法
    案例以串口发送485指令实现硬件需求:USB转485接口、变频器(由三科变频提供测试产品)这里写的是一些常用的功能,计划要完成一个全功能的参数设置程序,貌似工作量不小呢。【特别声明】:代码测试所使用的485通讯是三科SKI90型号的机器,其他品牌型号变频器用本代码调试时务必请先查阅......
  • [Python学习日记-10] Python中的流程控制(if...else...)
    简介        假如把写程序比做走路,那我们到现在为止,一直走的都是直路,还没遇到过分叉口,想象现实中,你遇到了分叉口,然后你决定往哪拐必然是有所动作的。你要判断那条岔路是你真正要走的路,如果我们想让程序也能处理这样的判断怎么办?很简单,只需要在程序里预设一些条件判断......
  • Python 加载 TensorFlow 模型
    1.SavedModel和HDF5加载TensorFlow模型为了加载一个TensorFlow模型,我们首先需要明确模型的格式。TensorFlow支持多种模型格式,但最常见的两种是SavedModel和HDF5(对于Keras模型)。这里,我将分别给出加载这两种模型格式的示例代码。1.1加载SavedModel格式的TensorFlow模型SavedModel......