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 value
- class 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 letter
- def 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()
|