(Python)思考题2:数据结构的选择

题目

        假设我们正在开发一个学生成绩管理系统,我们可以用什么数据结构来存储学生的姓名和她们对应的成绩?后续还支持增删改的操作.

目录

题目

解析

原理

不可变对象

可变对象

不可变对象和可变对象的差异

总结


示例输入

Alice 85

Bob 92

Charlie 78

David 90

Emma 88

示例输出 

可以使用字典来存储学生的姓名和他们对应的成绩.

# 存储学生成绩
student_scores = {
    "Alice": 85,
    "Bob": 92,
    "Charlie": 78,
    "David": 90,
    "Emma": 88
}

示例代码

def func_add_student(student_scores, count):
    while count > 0:
        name = input("请输入学生姓名:")
        score = int(input("请输入学生成绩:"))
        student_scores[name] = score
        count -= 1


student_scores = {}
student_count = eval(input("请输入学生人数:"))
func_add_student(student_scores, student_count)
print(student_scores)

示例效果

请输入学生人数:5
请输入学生姓名:Alice
请输入学生成绩:85
请输入学生姓名:Bob
请输入学生成绩:92
请输入学生姓名:Charlie
请输入学生成绩:78
请输入学生姓名:David
请输入学生成绩:90
请输入学生姓名:Emma
请输入学生成绩:88
{'Alice': 85, 'Bob': 92, 'Charlie': 78, 'David': 90, 'Emma': 88}

 

解析

使用字典来方便地存储、查找、添加、修改和删除学生的成绩信息;

除了字典,还有一些可以用来存储学生信息的数据结构

  1. 列表(List):可以将每个学生的信息(例如姓名、成绩、年龄等)存储为一个列表元素。但列表查找特定学生的信息时效率较低。

  2. 元组(Tuple):类似于列表,但元组不可修改。如果学生信息确定不会改变,可以使用元组。

  3. 类(Class):可以自定义一个 Student 类来表示学生,每个属性(如姓名、年龄、成绩等)作为类的成员变量。这样可以使代码更具结构性和可读性。

  4. 集合(Set):如果只需要存储学生的唯一标识(例如学号),并且不关心顺序和重复,可以使用集合。

  5. 数据库:例如使用 SQLite 等数据库来存储和管理学生信息,这在实际的大规模应用中更常见,方便进行复杂的查询、更新和数据管理。

原理

在 Python 中,不可变对象(如整数、字符串、元组等)在传递给函数时,传递的是对象的值,

可变对象(如列表、字典等)传递的是对象的引用。

不可变对象

  • 不可变对象的值在创建后不能被修改。
  • 对不可变对象进行操作时,实际上是创建了一个新的对象,并将变量重新指向新的对象。
  • 常用于需要保证数据的一致性和安全性的场景,因为其值不会意外被改变。
  • 由于不可变,在多个变量引用同一个不可变对象时,不会因为一个变量的修改而影响其他变量。

可变对象

  • 可变对象的值可以在创建后进行修改。
  • 对可变对象进行操作时,是直接在原对象上进行修改。
  • 当多个变量引用同一个可变对象时,一个变量对其的修改会影响到其他引用该对象的变量。
  • 在需要动态修改和存储数据集合时非常有用。

不可变对象和可变对象的差异

不可变对象的例子中,函数内对参数的修改不会影响到函数外的原始对象。

而在可变对象的例子中,函数内对列表的修改会影响到函数外的原始列表,因为传递的是引用

# 不可变对象示例
def modify_immutable(obj):
    obj += 5
    print("Inside function:", obj)

num = 5
modify_immutable(num)
print("Outside function:", num)

# 可变对象示例
def modify_mutable(obj):
    obj.append(5)
    print("Inside function:", obj)

my_list = [1, 2, 3]
modify_mutable(my_list)
print("Outside function:", my_list)

# 字符串(不可变对象)
def modify_string(s):
    s = s + " World"
    print("Inside function:", s)

my_string = "Hello"
modify_string(my_string)
print("Outside function:", my_string)

# 元组(不可变对象)
def modify_tuple(t):
    t = t + (5,)
    print("Inside function:", t)

my_tuple = (1, 2, 3)
modify_tuple(my_tuple)
print("Outside function:", my_tuple)

# 字典(可变对象)
def modify_dict(d):
    d['new_key'] = 'new_value'
    print("Inside function:", d)

my_dict = {'key1': 'value1', 'key2': 'value2'}
modify_dict(my_dict)
print("Outside function:", my_dict)
  • 对于字符串,函数内的修改不会影响到外部的原始字符串。
  • 对于元组,由于元组不可变,函数内尝试修改会创建一个新的元组,但不会影响到外部的原始元组。
  • 对于字典,函数内的修改会影响到外部的原始字典,因为字典是可变对象,传递的是引用。

总结

        在编程中,理解可变对象不可变对象的特性有助于避免一些常见的错误.

        例如在函数中意外修改了全局的可变对象,或者对不可变对象的修改期望导致的错误。根据具体的需求,选择合适的数据类型可以提高程序的效率和正确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Marst·Writer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值