Answers:
使用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上也可以正常工作,因此是应该使用的规范形式)。请参阅generator.next()在python 3.0中可见吗?以获得更深入的解释。相应地更新了我的答案。
正确的答案是使用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
含义是,可迭代输入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']