В этом конкретном случае c происходит то, что вы хотите вернуть значение self.x
откуда-то из середины метода __next__
, прежде чем увеличивать значение self.x
, готовое для следующая итерация. Поэтому переменная odd_num
используется для хранения этого значения. Если вместо этого вы вернете self.x
после оператора self.x += 2
(т.е. прибавите 2), то вы получите другой ответ, как вы видели.
Другой вариант, который вы можете рассмотреть, - это вместо того, чтобы писать свой собственный класс, чтобы реализовать итератор с помощью функции генератора, если вы хотите использовать значение некоторой переменной из середины кода. Это потому, что вы можете поместить оператор yield
где угодно. В этом примере это будет выглядеть примерно так:
def odd_num(num=0):
x = 1
while x <= num:
yield x
x += 2
for num in odd_num(10):
print(num)
Это дает:
1
3
5
7
9
(обратите внимание на while
вместо if
, которое у вас было в ваш метод __next__
.)
Здесь оператор yield
находится перед оператором x += 2
, что не может быть выполнено с помощью return
из метода (функции). Поэтому нет необходимости сохранять значение в другой переменной, чтобы использовать его позже.