Я пытаюсь понять, как оператор for x in y
работает в python. Я нашел здесь документацию: https://docs.python.org/3/reference/compound_stmts.html#for. В нем говорится, что выражение y
вычисляется один раз и должно давать итеративный объект.
Следующий код печатает числа 1,2,3,4,5, хотя мой класс не реализует __iter__
( что является моим пониманием итерации).
class myclass:
def __init__(self):
self.x = [1,2,3,4,5]
def __getitem__(self,index):
return self.x[index]
m = myclass()
for i in m:
print(i)
Я знаю, что существует встроенный метод iter()
, который возвращает итератор для объекта последовательности, используя его функцию .__getitem__()
и счетчик, который начинается с 0.
Я предполагаю, что python вызывает функцию iter()
для выражения y
в операторе for x in y
. Таким образом, он преобразует мой объект, реализующий .__getitem__
, в итератор, и когда мой объект вызывает исключение IndexError
во время вызова .__getitem__
, итератор превращает это в исключение StopIteration
, а для l oop заканчивается.
Это правильно? Правильно это или нет, объясняется ли это где-то в документации, или мне нужно go заглянуть внутрь исходного кода реализации?