123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- class Iterator:
- def __init__(self, text: str):
- self.text = text.upper()
- self.index = 0
- def __iter__(self):
- return self
-
- def __next__(self):
- try:
- result = self.text[self.index]
- except IndexError:
- raise StopIteration
- self.index += 1
- return result
-
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- class SequenceIterator:
- def __init__(self, data):
- self.data = data
- self.start_index = 0
- def is_even(self, value):
- return value%2 == 0
- def __iter__(self):
- return self
-
- def __next__(self):
- if self.start_index >= len(self.data):
- raise StopIteration
- value = self.data[self.start_index]
-
- if self.is_even(len(self.data)) and self.start_index == len(self.data) - 2:
- self.start_index = 1
- elif self.is_even(len(self.data)) == False and self.start_index == len(self.data) - 1:
- self.start_index = 1
- else:
- self.start_index += 2
- 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)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- class InfinityIterator:
- def __init__(self, start=0):
- self.value = start
- def __iter__(self):
- return self
- def __next__(self):
- foo = self.value
- self.value += 10
- return foo
- def test_6():
- for i in InfinityIterator(7):
- print(i)
- # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def test_2():
- container = SequenceIterator([1, 5, 4, 6, 43, True, 'hello'])
- # container = SequenceIterator([1, 5, 4, 6, 43, True])
- for i in container:
- print(i)
- def test_1():
- phrase = Iterator('Qwerty')
- it_1 = iter(phrase)
- it_2 = iter(phrase)
- for i in it_1:
- print(i)
- for i in it_1:
- print(i)
- for i in it_2:
- print(i)
- def main():
- # test_1()
- # test_2()
- # test_3()
- # test_4()
- # test_5()
- # test_6()
- if __name__ == '__main__':
- main()
|