1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
| import random
class CIter(object):
__slots__=('idx',)
randrange=random.randrange
def __init__(self,clock=False,*args):
self.idx=()
for x in args:
self.idx+=(CIter.Compound(x if not clock else x-1,self.idx[-1] if self.idx!=() else None))
self.idx[-1](-1)
def next(self):
self.idx[-1].next()
def random(self):
return tuple(x.random() for x in self.idx)
def __call__(self):
self.next()
a=tuple(x() for x in self.idx)
return a if None!=a[0] else None
class Compound(object):
__slots__=('limit','val','parent')
def __init__(self,val,parent=None):
self.limit=val
self.val=0
self.parent=parent
def next(self):
if self.val+1>self.limit:
if self.parent is not None:
self.val=0
self.parent.next()
else: self.val=None
else: self.val+=1
def reset(self): self.val=0
def random(self):
return CIter.randrange(self.limit+1)
def __call__(self,val=None):
if val is None:return self.val
elif val> self.limit:
self.limit=self.val=val
else: self.val=val
if __name__=='__main__':
a=CIter(False,10,10)
while 1:
b=a()
if b is None: break
else: print(b)
#for x in range(20): print(a.random())
#Et façon 'horloge'
print('\n\n')
a=CIter(True,10,10)
while 1:
b=a()
if b is None: break
else: print(b)
#-------------
#Execution
#-------------
(0, 0)
(0, 1)
(0, 2)
(1, 0)
(1, 1)
(1, 2)
(2, 0)
(2, 1)
(2, 2)
(0, 0)
(0, 1)
(1, 0)
(1, 1) |
Partager