Python 在字典上循环时缺少项

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

我尝试创建一个student类对象,收集一些数据并显示:

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提出的相同观点。虽然你只有一个例子,但你没有意识到问题所在。一旦创建了
学生
的第二个实例,您就会看到为
科目
成绩
使用类变量的问题。可变类变量(或者至少,实际上对它们进行变异)通常是个坏主意。将它们保存为常量,所有实例的常量都应相同。