iter_3.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. class Iterator:
  2. def __init__(self, text: str):
  3. self.text = text.upper()
  4. self.index = 0
  5. def __iter__(self):
  6. return self
  7. def __next__(self):
  8. try:
  9. result = self.text[self.index]
  10. except IndexError:
  11. raise StopIteration
  12. self.index += 1
  13. return result
  14. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  15. class SequenceIterator:
  16. def __init__(self, data):
  17. self.data = data
  18. self.start_index = 0
  19. def is_even(self, value):
  20. return value%2 == 0
  21. def __iter__(self):
  22. return self
  23. def __next__(self):
  24. if self.start_index >= len(self.data):
  25. raise StopIteration
  26. value = self.data[self.start_index]
  27. if self.is_even(len(self.data)) and self.start_index == len(self.data) - 2:
  28. self.start_index = 1
  29. elif self.is_even(len(self.data)) == False and self.start_index == len(self.data) - 1:
  30. self.start_index = 1
  31. else:
  32. self.start_index += 2
  33. return value
  34. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  35. class Stack:
  36. def __init__(self):
  37. self.items = []
  38. def push(self, item):
  39. self.items.append(item)
  40. def pop(self):
  41. if len(self.items) == 0:
  42. print("Empty Stack")
  43. else:
  44. return self.items.pop() # Последний элемент
  45. # возвращает последний элемент, но не удаляет его
  46. def peek(self):
  47. if len(self.items) == 0:
  48. print("Empty Stack")
  49. else:
  50. return self.items[-1]
  51. def is_empty(self):
  52. return len(self.items) == 0
  53. def size(self):
  54. return len(self.items)
  55. def __iter__(self):
  56. return StackIterator(self)
  57. class StackIterator:
  58. def __init__(self, stack):
  59. self.stack = stack
  60. def __iter__(self):
  61. return self
  62. def __next__(self):
  63. if self.stack.is_empty():
  64. raise StopIteration
  65. return self.stack.pop()
  66. def test_3():
  67. stack = Stack()
  68. stack.push(100)
  69. stack.push(True)
  70. stack.push('hello')
  71. stack.push('world')
  72. # Используем итератор для обхода стека
  73. for item in stack:
  74. print(item)
  75. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  76. class FibonacciIterator:
  77. def __init__(self, n):
  78. self.n = n
  79. self.index = 0
  80. self.first = 0
  81. self.second = 0
  82. def __iter__(self):
  83. return self
  84. def __next__(self):
  85. if self.index == self.n:
  86. raise StopIteration
  87. if self.index == 1:
  88. result = 1
  89. else:
  90. result = self.first + self.second
  91. self.index += 1
  92. self.first = self.second
  93. self.second = result
  94. return result
  95. def test_4():
  96. fibonacci_iter = FibonacciIterator(7)
  97. for number in fibonacci_iter:
  98. print(number)
  99. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  100. class Book:
  101. def __init__(self, title, pages):
  102. self.title = title
  103. self.pages = pages
  104. class Library:
  105. def __init__(self):
  106. self.books = []
  107. def add_book(self, book):
  108. self.books.append(book)
  109. def __iter__(self):
  110. return LibraryIterator(self)
  111. class LibraryIterator:
  112. def __init__(self, library):
  113. self.library = library
  114. self.book_number = len(self.library.books)
  115. self.book = 0
  116. self.page = 0
  117. self.next_raise = False
  118. def __iter__(self):
  119. return self
  120. def __next__(self):
  121. if self.next_raise:
  122. raise StopIteration
  123. if self.book == self.book_number - 1 and self.page == len(self.library.books[self.book].pages) - 1:
  124. self.next_raise = True
  125. page = self.library.books[self.book].pages[self.page]
  126. if self.page == len(self.library.books[self.book].pages) - 1:
  127. self.page = 0
  128. self.book += 1
  129. else:
  130. self.page += 1
  131. return page
  132. def test_5():
  133. book1 = Book("Book 1", ["Page 1", "Page 2", "Page 3", "Page 4"])
  134. book2 = Book("Book 2", ["Page A", "Page B", "Page C"])
  135. book3 = Book("Book 3", ["Chapter 1", "Chapter 2"])
  136. library = Library()
  137. library_iterator = LibraryIterator(library)
  138. library.add_book(book1)
  139. library.add_book(book2)
  140. library.add_book(book3)
  141. # library_iterator.test()
  142. # Используем вложенный итератор для обхода страниц в библиотеке
  143. for page in library:
  144. print(page)
  145. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  146. class InfinityIterator:
  147. def __init__(self, start=0):
  148. self.value = start
  149. def __iter__(self):
  150. return self
  151. def __next__(self):
  152. foo = self.value
  153. self.value += 10
  154. return foo
  155. def test_6():
  156. for i in InfinityIterator(7):
  157. print(i)
  158. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  159. def test_2():
  160. container = SequenceIterator([1, 5, 4, 6, 43, True, 'hello'])
  161. # container = SequenceIterator([1, 5, 4, 6, 43, True])
  162. for i in container:
  163. print(i)
  164. def test_1():
  165. phrase = Iterator('Qwerty')
  166. it_1 = iter(phrase)
  167. it_2 = iter(phrase)
  168. for i in it_1:
  169. print(i)
  170. for i in it_1:
  171. print(i)
  172. for i in it_2:
  173. print(i)
  174. def main():
  175. # test_1()
  176. # test_2()
  177. # test_3()
  178. # test_4()
  179. # test_5()
  180. # test_6()
  181. if __name__ == '__main__':
  182. main()