Середній рівень об'єктно-орієнтованого програмування в Python
Jake Roach
Data Engineer
Класи, що дають проходити колекцію обʼєктів або потік даних і повертати по одному елементу
list, tuple, але поводяться інакшеfornext()$$
Протокол ітератора…
# Колекція
chuck = NameIterator("Charles Carmicheal")
for letter in chuck:
print(letter)
C
h
u
...
# Потік даних
fun_game = DiceGame(rolls=3)
next(fun_game) # ... і так далі
4
__iter__()
... return self$$
__next__()
$$
Щоб клас вважався ітератором, потрібно визначити і __iter__(), і __next__()!
class CoinFlips:
def __init__(self, number_of_flips):
self.number_of_flips = number_of_flips # Зберегти загальну кількість підкидань
self.counter = 0
def __iter__(self):
return self # Повернути посилання на ітератор
# Підкинути наступну монету, повернути результат
def __next__(self):
if self.counter < self.number_of_flips:
self.counter += 1
return random.choice(["H", "T"])
three_flips = CoinFlips(3)
# Підкиньте монету тричі
next(three_flips)
next(three_flips)
next(three_flips)
H
H
T
three_flips = CoinFlips(3)
# Тепер спробуйте пройти всі елементи ітератора
for flip in three_flips:
print(flip)
T
H
T
None
None
None
...
...
def __next__(self):
# Лише якщо монету ще не підкинули "number_of_flips" разів
if self.counter < self.number_of_flips:
self.counter += 1
return random.choice(["H", "T"])
else: # Інакше зупинити виконання через StopIteration
raise StopIteration
three_flips = CoinFlips(3)
# Тепер спробуйте пройти всі елементи ітератора
for flip in three_flips:
print(flip)
H
T
H
while True:
try:
next(three_flips) # Взяти наступний елемент three_flips
# Перехопити виняток StopIteration
except StopIteration:
print("Completed all coin flips!")
break
H
H
H
Completed all coin flips!
Середній рівень об'єктно-орієнтованого програмування в Python