Python 在字典上循环时缺少项
我尝试创建一个student类对象,收集一些数据并显示:Python 在字典上循环时缺少项,python,list,dictionary,oop,zip,Python,List,Dictionary,Oop,Zip,我尝试创建一个student类对象,收集一些数据并显示: class Student: subjects = [] grades = [] d = {} def __init__(self, name, id): self.name = name self.id = id def addGrade(self, subject, grade): self.subjects.appe
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())
输出变为
数学:90
它忽略了其他值 在showGrades中调用
return subject+':'+str(self.d[subject])
时,退出函数,不能在循环中使用return。您应该根据自己的喜好解析和格式化输出,然后在循环外使用return。在showGrades中调用return subject+':'+str(self.d[subject])
退出函数时,不能在循环中使用return。您应该根据自己的喜好解析和格式化输出,然后在循环外使用return。您希望返回主题+':'+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']
您希望
showGrades
中的return subject+':'+str(self.d[subject])
运行三次,但当它到达第一次返回时,它将离开循环。因此,将您的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']
您遇到的具体问题是,您正在将一个(无条件的)
return
放在for
循环中(因此它在循环的第一次迭代时返回),而不是例如,构建一个列表并在循环后返回该列表
然而,与此不同的是,您的代码也在修改类变量,如果您创建另一个实例stu2=Student(…)
,并且发现第二个学生已经有了科目和成绩,您会感到惊讶
要解决第二个问题,您需要做的是将主题
和等级
改为实例变量,并在\uuuuuuu init\uuuu
中初始化它们。您可以对类变量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()) # []
您遇到的具体问题是,您正在将一个(无条件的)
return
放在for
循环中(因此它在循环的第一次迭代时返回),而不是例如,构建一个列表并在循环后返回该列表
然而,与此不同的是,您的代码也在修改类变量,如果您创建另一个实例stu2=Student(…)
,并且发现第二个学生已经有了科目和成绩,您会感到惊讶
要解决第二个问题,您需要做的是将主题
和等级
改为实例变量,并在\uuuuuuu init\uuuu
中初始化它们。您可以对类变量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()) # []
请以与运行代码时相同的方式缩进代码。(现在根据可能的情况进行编辑以修复。)顺便说一句,您应该将
subjects=[]
移动到\uuu init\uu()
中,作为self.subjects=[]
。与等级相同
。另外,d={}
什么也不做。在我的回答中,我讨论了@quamrana提出的相同观点。虽然你只有一个例子,但你没有意识到问题所在。一旦创建了学生
的第二个实例,您就会看到为科目
和成绩
使用类变量的问题。可变类变量(或者至少,实际上对它们进行变异)通常是个坏主意。将它们保存为常量,所有实例的常量都应相同。请以与运行代码时相同的方式缩进代码。(现在根据可能的情况进行编辑以修复。)顺便说一句,您应该将subjects=[]
移动到\uuu init\uu()
中,作为self.subjects=[]
。与等级相同
。另外,d={}
什么也不做。在我的回答中,我讨论了@quamrana提出的相同观点。虽然你只有一个例子,但你没有意识到问题所在。一旦创建了学生
的第二个实例,您就会看到为科目
和成绩
使用类变量的问题。可变类变量(或者至少,实际上对它们进行变异)通常是个坏主意。将它们保存为常量,所有实例的常量都应相同。