2 回答
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()) # []
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']
添加回答
举报