Мне нужно перебирать круговой список, возможно, много раз, каждый раз, начиная с последнего посещенного элемента.
Вариант использования - это пул соединений. Клиент запрашивает соединение, итератор проверяет, доступно ли указанное соединение, и возвращает его, в противном случае выполняет цикл до тех пор, пока не найдет доступное соединение.
Есть ли удобный способ сделать это в Python?
pool.next()
для получения единственного следующего элемента из циклаnext(iterator)
(который, кстати, также отлично работает на Python 2.x, и, следовательно, является канонической формой, которую следует использовать). См. Виден ли генератор.next () в python 3.0? для более подробного объяснения. Соответственно обновил свой ответ.Правильный ответ - использовать itertools.cycle . Но предположим, что такой библиотечной функции не существует. Как бы вы это реализовали?
Используйте генератор :
Затем вы можете использовать
for
оператор для бесконечной итерации или вызватьnext()
для получения единственного следующего значения из итератора генератора:источник
while True
средство повторять вечноitertools.cycle
это лучший ответ. Это показывает, как можно было бы написать ту же функцию, еслиitertools
она недоступна :)itertools.cycle
делает? Или простой генератор будет более эффективным с точки зрения памяти? Согласноcycle
документам :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
cycle
подразумевает, что итерация ввода преобразуется вlist
до запуска генератора, посколькуiterable
она « годна только для одного прохода по набору значений».Или можно сделать так:
печатает abcdefab c ... навсегда
источник
вы можете сделать это с помощью
append(pop())
цикла:или
for i in range()
цикл:или просто:
все из которых печатают:
из трех я был бы склонен к подходу append (pop ()) как функции
источник
Если вы хотите изменить
n
время цикла ,ncycles
примените рецепт itertools :источник
Вам нужен собственный итератор - я адаптирую итератор из этого ответа .
источник