마지막으로 방문한 항목부터 시작할 때마다 순환 목록을 여러 번 반복해야합니다.
유스 케이스는 연결 풀입니다. 클라이언트는 연결을 요청하고 반복자는 지정 연결이 사용 가능한지 확인하고이를 반환합니다. 그렇지 않으면 사용 가능한 연결을 찾을 때까지 반복됩니다.
Python에서 깔끔하게 수행 할 수있는 방법이 있습니까?
마지막으로 방문한 항목부터 시작할 때마다 순환 목록을 여러 번 반복해야합니다.
유스 케이스는 연결 풀입니다. 클라이언트는 연결을 요청하고 반복자는 지정 연결이 사용 가능한지 확인하고이를 반환합니다. 그렇지 않으면 사용 가능한 연결을 찾을 때까지 반복됩니다.
Python에서 깔끔하게 수행 할 수있는 방법이 있습니까?
답변:
를 사용 itertools.cycle
하면 정확한 목적이 있습니다.
from itertools import cycle
lst = ['a', 'b', 'c']
pool = cycle(lst)
for item in pool:
print item,
산출:
a b c a b c ...
(분명히 영원히 반복)
반복자를 수동으로 진행하고 하나씩 값을 가져 오려면 next(pool)
다음을 호출하면됩니다 .
>>> next(pool)
'a'
>>> next(pool)
'b'
pool.next()
는 사이클에서 단일 다음 항목을 가져 오는 데 사용
next(iterator)
(BTW는 Python 2.x에서도 잘 작동하므로 사용해야하는 표준 형식입니다). 참조 파이썬 3.0에서 볼 수의 generator.next을 ()? 더 자세한 설명을 위해. 그에 따라 내 대답을 업데이트했습니다.
정답은 itertools.cycle 을 사용하는 것 입니다. 그러나 라이브러리 함수가 존재하지 않는다고 가정 해 봅시다. 어떻게 구현 하시겠습니까?
발전기 사용 :
def circular():
while True:
for connection in ['a', 'b', 'c']:
yield connection
그런 다음 for
문을 사용하여 무한 반복하거나 next()
생성기 반복기에서 단일 다음 값을 가져 오기 위해 호출 할 수 있습니다 .
connections = circular()
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
#....
while True
영원히 반복 하는 수단
itertools.cycle
더 나은 대답입니다. itertools
사용할 수없는 경우 동일한 기능을 작성하는 방법을 보여줍니다. :)
cycle
는 입력 iterable이 list
생성기가 시작되기 전에 변환된다는 것을 암시합니다 iterable
. "값 세트를 한 번만 통과하는 데 적합"하기 때문입니다.
append(pop())
루프로 이를 수행 할 수 있습니다 .
l = ['a','b','c','d']
while 1:
print l[0]
l.append(l.pop(0))
또는 for i in range()
루프 :
l = ['a','b','c','d']
ll = len(l)
while 1:
for i in range(ll):
print l[i]
또는 간단히 :
l = ['a','b','c','d']
while 1:
for i in l:
print i
모두 인쇄 :
>>>
a
b
c
d
a
b
c
d
...etc.
세 가지 중 나는 함수로 append (pop ()) 접근 방식을 사용하는 경향이 있습니다.
servers = ['a','b','c','d']
def rotate_servers(servers):
servers.append(servers.pop(0))
return servers
while 1:
servers = rotate_servers(servers)
print servers[0]
사용자 지정 반복자가 필요합니다 . 이 답변 에서 반복자를 적용하겠습니다 .
from itertools import cycle
class ConnectionPool():
def __init__(self, ...):
# whatever is appropriate here to initilize
# your data
self.pool = cycle([blah, blah, etc])
def __iter__(self):
return self
def __next__(self):
for connection in self.pool:
if connection.is_available: # or however you spell it
return connection
n
시간 을 순환 하려면 ncycles
itertools 레시피를 구현하십시오 .
from itertools import chain, repeat
def ncycles(iterable, n):
"Returns the sequence elements n times"
return chain.from_iterable(repeat(tuple(iterable), n))
list(ncycles(["a", "b", "c"], 3))
# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']