Python - Как остановить итерацию цикла for через метод класса __next__?
Как создать итерируемый объект, подстраиваемый под цикл for. Вся проблема в том, что при достижения крайнего элемента, при следующей итерации возникает исключение:
return self.listing[self.key]
IndexError: list index out of range
Когда хотелось бы, чтобы не возникало ошибок, и цикл заканчивал выполнение как только все элементы будут перебраны.
Мой код:
class iteration:
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
def __init__(self, values):
# итерируемый объект
self.values = values
# начальный индекс с запасом
self.index = -1
# количество элементов (по индексу)
self.len_index = len(values) - 1
def __iter__(self):
return self
def __next__(self):
self.index += 1
return self.values[self.index]
for i in iteration(['Tom', 'Tim', 'Mark', 'May']):
print(i)
Ответы (2 шт):
Автор решения: Danis
→ Ссылка
вместо __next__ лучше реализовать __iter__
def __iter__(self):
for el in self.values:
yield el
либо так:
def __iter__(self):
yield from self.values
В данном случае переменные self.index и self.len_index не нужны
Автор решения: Xander
→ Ссылка
Для этого можно использовать исключение StopIteration:
def __next__(self):
self.index += 1
if self.index >= len(self.values):
raise StopIteration
return self.values[self.index]