how to make a generator use the last yielded value when it regains control

Azolex cretin at des.alpes.ch
Fri Apr 7 04:52:42 EDT 2006


just couldn't help taking the bait...

def morris(seed) :

     """
     >>> m = morris('3447221')
     >>> m.next()
     '1324172211'
     >>> m.next()
     '1113121411172221'
     >>> m.next()
     '31131112111431173211'
     """

     assert isinstance(seed,basestring) and seed.isdigit(),"bad seed"

     def itially(z) :
         feedback.z = z
         while True :
             yield feedback.z

     def feedback(gen) :
         while True :
             feedback.z = gen.next()
             yield feedback.z

     def morrisify(number) :
         from itertools import groupby
         for digit,sequence in groupby(number) :
             yield str(len(tuple(sequence)))
             yield digit

     return feedback(''.join(morrisify(number))
                       for number in itially(seed))



More information about the Python-list mailing list