В процессе освоения питона эта азбучная истина всплыла в очередной раз в не очень очевидной ситуации.
Понадобилось мне вручную поизвлекать объекты из итератора. Поначалу я написал так:
while True: obj = container.__iter__().next() ... обработка obj
и.. получил зацикливание. Немного подумав, я понял, что это вполне логично. Ибо __iter__() не просто возвращает итератор, а сначала создаёт его. Каждый раз заново. Соответственно, next() каждый раз возвращает из итератора первый объект, а до второго вообще никогда не доходит.
Вынос инварианта за пределы цикла эту проблему сразу же решил:
iterator = container.__iter__() while True: obj = iterator.next() ... обработка obj
Оригинал этой записи в личном блоге.
Tags:
no subject
no subject
for obj in container, но в данном случае мне приспичило извлекать объекты вручную: http://ru-python.livejournal.com/323064.html