Выносите инварианты за пределы цикла

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

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

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

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

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

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

You can read this post at LiveJournal.
This entry was posted in Uncategorized and tagged , . Bookmark the permalink.

Leave a Reply