TelenkovDmitry hai 6 meses
pai
achega
95bafed81f
Modificáronse 1 ficheiros con 170 adicións e 1 borrados
  1. 170 1
      courses/python_oop/abstract/iter_3.py

+ 170 - 1
courses/python_oop/abstract/iter_3.py

@@ -46,6 +46,172 @@ class SequenceIterator:
 
         return value
 
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+class Stack:
+
+    def __init__(self):
+        self.items = []
+
+    def push(self, item):
+        self.items.append(item)
+
+    def pop(self):
+        if len(self.items) == 0:
+            print("Empty Stack")
+        else:
+            return self.items.pop() # Последний элемент
+
+    # возвращает последний элемент, но не удаляет его
+    def peek(self):
+        if len(self.items) == 0:
+            print("Empty Stack")
+        else:
+            return self.items[-1]
+
+    def is_empty(self):
+        return len(self.items) == 0
+
+    def size(self):
+        return len(self.items)
+
+    def __iter__(self):
+        return StackIterator(self)
+
+
+class StackIterator:
+
+    def __init__(self, stack):
+        self.stack = stack
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.stack.is_empty():
+            raise StopIteration
+        return self.stack.pop()
+
+
+def test_3():
+    stack = Stack()
+    stack.push(100)
+    stack.push(True)
+    stack.push('hello')
+    stack.push('world')
+# Используем итератор для обхода стека
+    for item in stack:
+        print(item)
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+class FibonacciIterator:
+
+    def __init__(self, n):
+        self.n = n
+        self.index = 0
+        self.first = 0
+        self.second = 0
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+        if self.index == self.n:
+            raise StopIteration
+
+        if self.index == 1:
+            result = 1    
+        else:
+            result = self.first + self.second
+
+        self.index += 1
+        self.first = self.second
+        self.second = result
+
+        return result
+
+def test_4():
+    fibonacci_iter = FibonacciIterator(7)
+
+    for number in fibonacci_iter:
+        print(number)
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+class Book:
+    def __init__(self, title, pages):
+        self.title = title
+        self.pages = pages
+
+
+class Library:
+    def __init__(self):
+        self.books = []
+
+    def add_book(self, book):
+        self.books.append(book)
+
+    def __iter__(self):
+        return LibraryIterator(self)
+
+
+class LibraryIterator:
+    def __init__(self, library):
+        self.library = library
+        self.book_number = len(self.library.books)
+        self.book = 0
+        self.page = 0
+        self.next_raise = False
+
+    def __iter__(self):
+        return self
+
+    def __next__(self):
+
+        if self.next_raise:
+            raise StopIteration
+
+        if self.book == self.book_number - 1 and self.page == len(self.library.books[self.book].pages) - 1:
+            self.next_raise = True
+
+        page = self.library.books[self.book].pages[self.page]
+
+        if self.page == len(self.library.books[self.book].pages) - 1:
+            self.page = 0
+            self.book += 1
+        else:
+            self.page += 1
+
+        return page
+        
+
+
+
+def test_5():
+    book1 = Book("Book 1", ["Page 1", "Page 2", "Page 3", "Page 4"])
+    book2 = Book("Book 2", ["Page A", "Page B", "Page C"])
+    book3 = Book("Book 3", ["Chapter 1", "Chapter 2"])
+
+    library = Library()
+    library_iterator = LibraryIterator(library)
+
+    library.add_book(book1)
+    library.add_book(book2)
+    library.add_book(book3)
+
+    # library_iterator.test()
+
+    # Используем вложенный итератор для обхода страниц в библиотеке
+    for page in library:
+        print(page)
+
+
+# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        
+
+
+
 
 def test_2():
     container = SequenceIterator([1, 5, 4, 6, 43, True, 'hello'])
@@ -68,7 +234,10 @@ def test_1():
 
 def main():
     # test_1()
-    test_2()
+    # test_2()
+    # test_3()
+    # test_4()
+    test_5()
 
 if __name__ == '__main__':
     main()