iter_2.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. class SequenceIterable:
  2. def __init__(self, values):
  3. self.values = values
  4. self.index = 0
  5. def __iter__(self):
  6. return self
  7. def __next__(self):
  8. if self.index >= len(self.values):
  9. raise StopIteration
  10. item = self.values[self.index]
  11. self.index += 1
  12. return item
  13. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14. class Countdown:
  15. def __init__(self, start):
  16. self.start = start
  17. def __iter__(self):
  18. return self
  19. def __next__(self):
  20. val = self.start
  21. if val < 0:
  22. raise StopIteration
  23. self.start -= 1
  24. return val
  25. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  26. class PowerTwo:
  27. def __init__(self, power):
  28. self.power = power
  29. self.index = 0
  30. def __iter__(self):
  31. return self
  32. def __next__(self):
  33. if self.index > self.power:
  34. raise StopIteration
  35. value = 2**self.index
  36. self.index += 1
  37. return value
  38. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  39. class Card:
  40. def __init__(self, rank, suit):
  41. self.rank = rank
  42. self.suit = suit
  43. def __str__(self):
  44. return f"{self.rank} {self.suit}"
  45. class Deck:
  46. ranks = [str(n) for n in range(2, 11)] + list('JQKA')
  47. suits = ['Clubs', 'Diamonds', 'Hearts', 'Spades']
  48. def __init__(self):
  49. self.cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
  50. def __getitem__(self, index):
  51. return self.cards[index]
  52. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  53. class FileReader:
  54. def __init__(self, filename):
  55. # self.file = open(filename)
  56. self.index = 0
  57. self.data = []
  58. with open(filename, 'r') as self.file:
  59. for line in self.file:
  60. self.data.append(line)
  61. def __iter__(self):
  62. return self
  63. def __next__(self):
  64. if self.index >= len(self.data):
  65. raise StopIteration
  66. st = self.data[self.index].strip()
  67. self.index += 1
  68. return st
  69. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  70. class InfinityIterator:
  71. def __init__(self):
  72. self.value = 0
  73. def __iter__(self):
  74. return self
  75. def __next__(self):
  76. foo = self.value
  77. self.value += 10
  78. return foo
  79. def test_7():
  80. # a = iter(InfinityIterator())
  81. a = InfinityIterator()
  82. print(next(a))
  83. print(next(a))
  84. print(next(a))
  85. def test_6():
  86. # reader = FileReader("lorem.txt")
  87. for lite in FileReader('lorem.txt'):
  88. print(lite)
  89. def test_5():
  90. deck = Deck()
  91. for card in deck:
  92. print(card)
  93. def test_4():
  94. for i in PowerTwo(4):
  95. print(i)
  96. def test_3():
  97. for i in Countdown(3):
  98. print(i)
  99. def test_2():
  100. container = SequenceIterable([1, 2 , 3, True, 'hello'])
  101. for i in container:
  102. print(i)
  103. def test_1():
  104. class MyClass:
  105. def __init__(self):
  106. self.items = [1, 2, 3]
  107. self.index = 0
  108. def __iter__(self):
  109. return self
  110. def __next__(self):
  111. if self.index >= len(self.items):
  112. raise StopIteration
  113. item = self.items[self.index]
  114. self.index += 1
  115. return item
  116. for item in MyClass():
  117. print(item)
  118. def main():
  119. l = [1, 2, 3]
  120. s = 'abc'
  121. # test_1()
  122. # test_2()
  123. # test_3()
  124. # test_4()
  125. # test_5()
  126. # test_6()
  127. test_7()
  128. if __name__ == '__main__':
  129. main()