November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Monday, August 27th, 2012 09:54 pm

В процессе освоения питона эта азбучная истина всплыла в очередной раз в не очень очевидной ситуации.

Понадобилось мне вручную поизвлекать объекты из итератора. Поначалу я написал так:

while True:
  obj = container.__iter__().next()
  ... обработка obj

и.. получил зацикливание. Немного подумав, я понял, что это вполне логично. Ибо __iter__() не просто возвращает итератор, а сначала создаёт его. Каждый раз заново. Соответственно, next() каждый раз возвращает из итератора первый объект, а до второго вообще никогда не доходит.

Вынос инварианта за пределы цикла эту проблему сразу же решил:

iterator = container.__iter__()
while True:
  obj = iterator.next()
  ... обработка obj

Оригинал этой записи в личном блоге.

Monday, August 27th, 2012 10:05 pm (UTC)
Этот конкретный пример я бы написал как
for obj in container.iteritems():
   ... обработка obj
Tuesday, August 28th, 2012 12:23 am (UTC)
"Осовение питона" — это прекрасно получилось! (В Москве сейчас 4:23 вечера, да.)