Как я могу бесконечно использовать элемент списка доходности

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть список каталогов, и этот элемент должен быть возвращен по одному за раз

итак, я закодировал, как показано ниже:

 def gen():
    list = ["dir_1", "dir_2", ..., "dir_n"]
    for i in list:
        yield i
  

Но я хочу получать каталог снова и снова, например dir_1 , dir_2 , … , dir_n , dir_1 , dir_2 … вот так.

Как мне поступить?

Ответ №1:

Вы можете использовать cycle, нет необходимости в другом генераторе, просто вызовите cycle на итераторе, и он будет циклически работать вечно

 from itertools import cycle

for dir in cycle(["dir_1", "dir_2", "dir_n"]):
   do stuff ...
   if some_reason:
     break
  

Ответ №2:

Вы можете использовать itertools.cycle именно то, что вы описываете:

 from itertools import cycle
def gen():
    lst = ["dir_1", "dir_2", "dir_n"]
    for i in cycle(lst):
        yield i
  

так что:

 i = gen()
for _ in range(5):
    print(next(i))
  

выводит:

 dir_1
dir_2
dir_n
dir_1
dir_2
  

Комментарии:

1. Или просто return cycle(lst) .

Ответ №3:

Это решение с помощью While цикла.

 def gen():
    while True:
        mylist = ["dir_1", "dir_2"]
        for i in mylist:
            yield i
  

Ответ №4:

Следующее решение должно быть быстрее и эффективнее:

 def gen(lst):
    yield from lst
    yield from gen(lst)
  

Использование:

 >>> g = gen(['a','b','c'])

>>> for x in g:
>>>     do something...
>>>     if some_reason:
>>>         break

>>> [next(g) for _ in range(7)]
['a', 'b', 'c', 'a', 'b', 'c', 'a']
  

В качестве альтернативы, если вы хотите ограничить генератор циклов, вы можете использовать следующую версию, которая позволяет вам устанавливать (необязательно) общую длину выходной последовательности:

 def gen(lst,limit=None):
    if type(limit) == int:
        g = gen(lst)
        for _ in range(limit):
            yield next(g)
        return
    yield from lst
    yield from gen(lst,limit)
  

Использование:

 >>> g = gen(['a','b','c'], limit=7))

>>> for x in g:
>>>     do something (for 7 times)...

>>> list(g)
['a', 'b', 'c', 'a', 'b', 'c', 'a']
  

Примечание. Если установленный вами предел превышает возможности рекурсии Python (обычно 1000 рекурсий), вы можете улучшить такие возможности с помощью следующего кода:

 >>> import sys
>>> sys.setrecursionlimit(some_greater_limit)