| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | 
class Mark:    def __init__(self, values):        self.values = values        self.index = 0    def __iter__(self):        print('Call iter Mark')        return self    def __next__(self):        print('Call next Mark')        if self.index >= len(self.values):            raise StopIteration        value = self.values[self.index]        self.index += 1        return valueclass Student:    def __init__(self, name, surname, makrs):        self.name = name        self.surname = surname        self.marks = makrs    # getitem реализует обращение по индексу    # Теперь можно итерироваться! Но не только так!    def __getitem__(self, item):        return self.name[item]    # елси нет своего __next__, будет вызван next внутри класса строки    # __iter__ должен возвращать объект, у которого реализован метод next    def __iter__(self):        print('Call iter Student')        self.index = 0        return self.marks    def __next__(self):        print('Call next Student')        if self.index >= len(self.name):            raise StopIteration        letter = self.name[self.index]        self.index += 1        return letterdef test_iter_1():    mark = Mark([2, 4, 3, 1, 5])    igor = Student('Igor', 'Nikolaev', mark)    # будет вызван метод __iter__, а если его нет __getitem__    for i in igor:        print(i)def main():    test_iter_1()    return    igor = Student('Igor', 'Nikolaev', [2, 4, 3, 1, 5])        a = [1, 2, 3]    b = iter(a)        try:        print(type(b))        print(next(b))        print(next(b))        print(next(b))        print(next(b))    except StopIteration:        print("Стор, нет следующего элемента!!!")        # А можно сделать так    c = a.__iter__()    c.__next__()    c.__next__()if __name__ == '__main__':    main()
 |