def cycle(seq):
"""Return a generator producing items from seq. When seq is
exhausted, the generator will cycle over from item 0 again.
Beware that a break statement is necessary in a for loop. Also, seq
is a sequence supporting the len function and enumerated 0-based.
Examples:
>>> seq = ['one', 'two', 'three']
>>> cyc = cycle(seq)
>>> next(cyc)
'one'
>>> next(cyc)
'two'
>>> next(cyc)
'three'
>>> next(cyc)
'one'
>>> next(cyc)
'two'
To reset, call for a new cycle:
>>> cyc = cycle(seq)
>>> next(cyc)
'one'
>>> for i, item in enumerate(cyc):
... print i, item
... if i > 3:
... break # Must break out manually
...
0 two
1 three
2 one
3 two
4 three
"""
i = 0
while True: # Cycle forever
yield seq[i]
i = (i + 1) % len(seq)
if __name__ == '__main__':
import doctest
doctest.testmod()