为了账号安全,请及时绑定邮箱和手机立即绑定

当我循环遍历字典时缺少项目

当我循环遍历字典时缺少项目

白板的微信 2023-07-27 10:06:22
我尝试创建一个学生类对象,并收集一些数据并显示它:class Student:     subjects = []    grades = []      d = {}    def __init__(self, name, id):            self.name = name            self.id = id     def addGrade(self, subject, grade):        self.subjects.append(subject)        self.grades.append(grade)    def showGrades(self):        self.d = dict(zip(self.subjects, self.grades))        for subject in self.d:            return subject + ' : ' + str(self.d[subject])当我尝试添加值时:    stu =Student('Zaki', 23)    stu.addGrade('Math',90)    stu.addGrade('Physicis',95)    stu.addGrade('English',100)    print(stu.showGrades())输出结果为 Math : 90并且它忽略了其他值!
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您遇到的具体问题是您将(无条件)放入循环return中for(因此它在循环的第一次迭代中返回),而不是例如构建一个列表并在循环后返回该列表。


然而,除此之外,您的代码还修改了类变量,如果您创建另一个实例并stu2 = Student(...)发现第二个学生已经有了科目和成绩,您会感到惊讶。


要解决第二个问题,您需要做的是将subjects和grades改为实例变量 - 并在__init__. 您可以对类变量执行类似的操作d,但看起来它可能仅在内部使用showGrades,并且最好用该方法(函数)中的局部变量替换。


把这些放在一起,你可能会得到这样的东西:


class Student: 


    def __init__(self, name, id):

            self.name = name

            self.id = id 

            self.subjects = []

            self.grades = []  



    def addGrade(self, subject, grade):

        self.subjects.append(subject)

        self.grades.append(grade)



    def showGrades(self):

        d = dict(zip(self.subjects, self.grades))

        grades = []

        for subject in d:

            grades.append(subject + ' : ' + str(d[subject]))

        return grades


stu =Student('Zaki', 23)

stu.addGrade('Math',90)

stu.addGrade('Physics',95)

stu.addGrade('English',100)

print(stu.showGrades())  # ['Math : 90', 'Physics : 95', 'English : 100']


stu2 = Student("Juan", 24)

print(stu2.showGrades())  # []


查看完整回答
反对 回复 2023-07-27
?
aluckdog

TA贡献1847条经验 获得超7个赞

您期望 return subject + ' : ' + str(self.d[subject])运行showGrades三次,但是当它到达第一次返回时,它就会离开循环。因此,将您的showGrades代码更改为:


def showGrades(self):

    self.d = dict(zip(self.subjects, self.grades))

    ret = []

    for subject in self.d:

        ret.append(subject + ' : ' + str(self.d[subject]))

    return ret # this will return list containing [subject : grade]

输出:


['Math : 90', 'Physicis : 95', 'English : 100']


查看完整回答
反对 回复 2023-07-27
  • 2 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信