#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)