Код с классами и итерацией не работает с использованием списков - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужна небольшая помощь с домашним заданием:

У меня есть учебный курс с названием и классом, а также класс с именем ученика, возрастом, а также в классе учеников должен быть список всех курсов и их оценки.

Я хочу использовать только списки. Я мог бы сделать это с помощью dict, но возможно ли это сделать с помощью списков? каждый курс содержит название курса и оценку

Код, который я пробовал, который ничего не делает:

class Course:
    def __init__(self,coursename,grade):
      self.coursename=coursename
      self.grade=int(grade)
      self.newList=[]

    def __str__(self):
    return self.coursename+":"+ str(self.grade)

class Student:
    def __init__(self,name,age):
      self.name=name
      self.age=int(age)
      self.listCoursenamesAndGrades=[]
      #super().__init__(self,coursename,grade)


    def addCourse(self,c):
        self.listCoursenamesAndGrades.append(c)


    def __iter__(self):
     self._current = 0
     return self


     def __next__(self):
        try:
          while True:
            c=self.listCoursenamesAndGrades[self.current]
            if (self.current <len(self.listCoursenamesAndGrades)):
               self.current+=1
            if c.grade > 59:
                return c
        except IndexError:
            raise StopIteration

вывод:

   s1=Student("Sam",24)
   C1=Course("js",80)
   s1.addCourse(Course("Math",85))
   s1.addCourse(Course("Math",70))
   for c in s1:
     print(c)

и вывод будет be:

Js:80
Math:85
Math:70

спасибо за помощь !!

1 Ответ

1 голос
/ 11 февраля 2020

Проблема в том, что __next__ должен возвращать один элемент; это не должно повторяться по списку. Для того, что вы хотите, было бы проще поместить итерационные логики c в __iter__ для запуска:

def __iter__(self):
    for c in self.listCoursenamesAndGrades:
        if c.grade > 59:
            yield c

Поскольку __iter__ не возвращает сам self, вы можете иметь несколько независимые итераторы (просто не изменяйте список курсов в это время).

В качестве примера превращения Student в итератор с собственным отдельным методом __next__, вам необходимо сохранить текущее состояние итерации на самом Student. Например:

# Since _current is an attribute of the Student instance itself,
# you can't have multiple independent iterators. Something like
#
#  i1 = iter(Student)
#  print(next(i1))
#  i2 = iter(Student)
#  print(next(i1)
#
# will print the same course twice; calling `iter(Student)` resets
# the object's iteration state.
def __iter__(self):
    self._current = 0
    return self

def __next__(self):
    try:
        while True:
            c = self.listCoursenamesAndGrades[self._current]
            self._current += 1
            if c.grade > 59:
                return c
    except IndexError:
        raise StopIteration
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...