Был дан хороший ответ, я хотел бы показать практический пример.
Определенный в вопросе Transaction
- это итератор . Его можно повторять всего один раз.
Хотя типичная итерация имеет форму for x in ...:
, давайте продолжим использовать более короткую list()
для демонстрации:
>>> t=Transactions()
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[]
>>> list(t)
[]
Для реального классаэто не то, что люди ожидают. Чтобы каждый раз выполнять итерацию по данным, для каждой итерации должен быть создан новый итератор, что делает исходный класс итерируемым :
class TransactionsIterator:
def __init__(self, t):
self.t = t
self.idx = 0
def __iter__(self):
return self
def __next__(self):
pos = self.idx
self.idx += 1
try:
return self.t[pos]
except IndexError:
raise StopIteration
class Transactions:
def __init__(self):
self.t = [1,2,9,12.00]
def __iter__(self):
return TransactionsIterator(self.t)
Это ведет себя так, как это обычно делают другие классы:
>>> t=Transactions()
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
[1, 2, 9, 12.0]
>>> list(t)
и, наконец, вам не нужно заново изобретать итератор списка, это все, что вам нужно:
class Transactions:
def __init__(self):
self.t = [1,2,9,12.00]
def __iter__(self):
return iter(self.t)
Вернуться к вопросу. Мы можем перебирать данные один раз с помощью итератора и каждый раз с помощью итерации. Весь смысл итераторов, возвращающих self
в __iter__
, состоит в том, что код итерации не должен различать эти два случая.