1. p.elagin

    11.03.2010

    0 ↑
    0 ↓
                    try:
    oSession = aSession.next()
    except StopIteration:
    ##### Вот тут что писать, чтоб заставить aSession на начало встать, т.е. чтоб next( ) опять первый елемент показал
  2. p.elagin

    11.03.2010

    0 ↑
    0 ↓
    Пока нашел вот так ) но как то не кашерно совсем.
    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 ]
  3. Вы делаете что-то ужасное :)

    Попробуйте так:

    itertools.cycle(some_list)
    

    См. itertools

  4. Иван Сагалаев

    11.03.2010

    1 ↑
    0 ↓

    Этот код действительно можно сделать чуть более понятным:

    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
    
  5. p.elagin

    12.03.2010

    0 ↑
    0 ↓
    вот это мне и нужно "from itertools import cycle"

    Спасибо Иван

    2Леонид Швечиков : что в гугле нашел и прилепил. поэтотому и отписал сюда так как нет изящества.
  6. xcat

    12.03.2010

    0 ↑
    0 ↓
    всегда приятно узнать чтото новое. ТОка недавно написал подобную фигню.
  7. Извините, что так резко ответил :)

    Буду учиться тепрению у Ивана Сагалаева.

  8. Я думаю, стоит обратить внимание на различия в реализациях.

    Иван предложил такой вариант:

    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
    
    • В решении Ивана итератор заново иницализируется после каждого прохода, и, к примеру, не будет работать с файлами.

    • Второй будет работать всегда, благодаря сохранению результата первого прохода.

    • С последовательностями (списками, тьюплами, строками) оба решения будут работать одинаково.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.