| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 | 
class SequenceIterable:    def __init__(self, values):        self.values = values        self.index = 0    def __iter__(self):        return self    def __next__(self):        if self.index >= len(self.values):            raise StopIteration        item = self.values[self.index]        self.index += 1        return item# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~class Countdown:    def __init__(self, start):        self.start = start    def __iter__(self):        return self    def __next__(self):        val = self.start         if val < 0:            raise StopIteration        self.start -= 1        return val# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~class PowerTwo:    def __init__(self, power):        self.power = power        self.index = 0    def __iter__(self):        return self    def __next__(self):        if self.index > self.power:            raise StopIteration        value = 2**self.index        self.index += 1        return value# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        class Card:    def __init__(self, rank, suit):        self.rank = rank        self.suit = suit    def __str__(self):        return f"{self.rank} {self.suit}"class Deck:    ranks = [str(n) for n in range(2, 11)] + list('JQKA')    suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']    def __init__(self):        self.cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]    def __getitem__(self, index):        return self.cards[index]# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        class FileReader:    def __init__(self, filename):        # self.file = open(filename)        self.index = 0        self.data = []        with open(filename, 'r') as self.file:            for line in self.file:                self.data.append(line)    def __iter__(self):        return self    def __next__(self):        if self.index >= len(self.data):            raise StopIteration        st = self.data[self.index].strip()        self.index += 1        return st# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~        class InfinityIterator:        def __init__(self):        self.value = 0    def __iter__(self):        return self        def __next__(self):        foo = self.value        self.value += 10        return foodef test_7():    # a = iter(InfinityIterator())    a = InfinityIterator()    print(next(a))    print(next(a))    print(next(a))def test_6():    # reader = FileReader("lorem.txt")    for lite in FileReader('lorem.txt'):        print(lite)def test_5():    deck = Deck()    for card in deck:        print(card)def test_4():    for i in PowerTwo(4):        print(i)def test_3():    for i in Countdown(3):        print(i)def test_2():    container = SequenceIterable([1, 2 , 3, True, 'hello'])    for i in container:        print(i)def test_1():    class MyClass:        def __init__(self):            self.items = [1, 2, 3]            self.index = 0        def __iter__(self):            return self        def __next__(self):            if self.index >= len(self.items):                raise StopIteration            item = self.items[self.index]            self.index += 1            return item    for item in MyClass():        print(item)    def main():    l = [1, 2, 3]    s = 'abc'    # test_1()    # test_2()    # test_3()    # test_4()    # test_5()    # test_6()    test_7()if __name__ == '__main__':    main()
 |