-
try:
oSession = aSession.next()
except StopIteration:
##### Вот тут что писать, чтоб заставить aSession на начало встать, т.е. чтоб next( ) опять первый елемент показал -
Пока нашел вот так ) но как то не кашерно совсем.
class perpetuumIterator:
def __init__( self, aList ):
self._list = aList
def __iter__( self ):
return self
def next( self ):
self._list = self._list[1:] + [ self._list[0] ]
return self._list[ -1 ] -
Этот код действительно можно сделать чуть более понятным:
class perpetuumIterator: def __init__(self, original_list): self.original_list = original_list def __iter__(self): self.iterator = iter(self.original_list) return self def next(self): try: return self.iterator.next() except StopIteration: self.__iter__() return self.iterator.next()Но вообще, вместо класса-итератора тут больше подойдёт генератор:
def perpetuumIterator(iterator): while True: for item in iterator: yield itemА самая хорошая новость в том, что такая штука уже есть в стандартной библиотеке:
from itertools import cycle -
вот это мне и нужно "from itertools import cycle"
Спасибо Иван
2Леонид Швечиков : что в гугле нашел и прилепил. поэтотому и отписал сюда так как нет изящества. -
всегда приятно узнать чтото новое. ТОка недавно написал подобную фигню.
-
Извините, что так резко ответил :)
Буду учиться тепрению у Ивана Сагалаева.
-
Я думаю, стоит обратить внимание на различия в реализациях.
Иван предложил такой вариант:
def perpetuumIterator(iterator): while True: for item in iterator: yield itemВ документации приведён пример, эквивалентный встоенному в itertools:
def cycle(iterable): # cycle('ABCD') --> A B C D A B C D A B C D ... saved = [] for element in iterable: yield element saved.append(element) while saved: for element in saved: yield elementВ решении Ивана итератор заново иницализируется после каждого прохода, и, к примеру, не будет работать с файлами.
Второй будет работать всегда, благодаря сохранению результата первого прохода.
С последовательностями (списками, тьюплами, строками) оба решения будут работать одинаково.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.


