iter_1.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. class Mark:
  2. def __init__(self, values):
  3. self.values = values
  4. self.index = 0
  5. def __iter__(self):
  6. print('Call iter Mark')
  7. return self
  8. def __next__(self):
  9. print('Call next Mark')
  10. if self.index >= len(self.values):
  11. raise StopIteration
  12. value = self.values[self.index]
  13. self.index += 1
  14. return value
  15. class Student:
  16. def __init__(self, name, surname, makrs):
  17. self.name = name
  18. self.surname = surname
  19. self.marks = makrs
  20. # getitem реализует обращение по индексу
  21. # Теперь можно итерироваться! Но не только так!
  22. def __getitem__(self, item):
  23. return self.name[item]
  24. # елси нет своего __next__, будет вызван next внутри класса строки
  25. # __iter__ должен возвращать объект, у которого реализован метод next
  26. def __iter__(self):
  27. print('Call iter Student')
  28. self.index = 0
  29. return self.marks
  30. def __next__(self):
  31. print('Call next Student')
  32. if self.index >= len(self.name):
  33. raise StopIteration
  34. letter = self.name[self.index]
  35. self.index += 1
  36. return letter
  37. def test_iter_1():
  38. mark = Mark([2, 4, 3, 1, 5])
  39. igor = Student('Igor', 'Nikolaev', mark)
  40. # будет вызван метод __iter__, а если его нет __getitem__
  41. for i in igor:
  42. print(i)
  43. def main():
  44. test_iter_1()
  45. return
  46. igor = Student('Igor', 'Nikolaev', [2, 4, 3, 1, 5])
  47. a = [1, 2, 3]
  48. b = iter(a)
  49. try:
  50. print(type(b))
  51. print(next(b))
  52. print(next(b))
  53. print(next(b))
  54. print(next(b))
  55. except StopIteration:
  56. print("Стор, нет следующего элемента!!!")
  57. # А можно сделать так
  58. c = a.__iter__()
  59. c.__next__()
  60. c.__next__()
  61. if __name__ == '__main__':
  62. main()