题目
假设我们正在开发一个学生成绩管理系统,我们可以用什么数据结构来存储学生的姓名和她们对应的成绩?后续还支持增删改的操作.
目录
示例输入
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}
解析
使用字典来方便地存储、查找、添加、修改和删除学生的成绩信息;
除了字典,还有一些可以用来存储学生信息的数据结构
列表(List):可以将每个学生的信息(例如姓名、成绩、年龄等)存储为一个列表元素。但列表查找特定学生的信息时效率较低。
元组(Tuple):类似于列表,但元组不可修改。如果学生信息确定不会改变,可以使用元组。
类(Class):可以自定义一个
Student
类来表示学生,每个属性(如姓名、年龄、成绩等)作为类的成员变量。这样可以使代码更具结构性和可读性。集合(Set):如果只需要存储学生的唯一标识(例如学号),并且不关心顺序和重复,可以使用集合。
数据库:例如使用
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)
- 对于字符串,函数内的修改不会影响到外部的原始字符串。
- 对于元组,由于元组不可变,函数内尝试修改会创建一个新的元组,但不会影响到外部的原始元组。
- 对于字典,函数内的修改会影响到外部的原始字典,因为字典是可变对象,传递的是引用。
总结
在编程中,理解可变对象和不可变对象的特性有助于避免一些常见的错误.
例如在函数中意外修改了全局的可变对象,或者对不可变对象的修改期望导致的错误。根据具体的需求,选择合适的数据类型可以提高程序的效率和正确性。